How to 'ignore' an error in Python?

Chris Angelico rosuav at gmail.com
Sat Apr 29 22:04:30 EDT 2023


On Sun, 30 Apr 2023 at 11:58, Chris Green <cl at isbd.net> wrote:
>
> Chris Angelico <rosuav at gmail.com> wrote:
> > On Sat, 29 Apr 2023 at 14:27, Kushal Kumaran <kushal at locationd.net> wrote:
> > >
> > > On Fri, Apr 28 2023 at 04:55:41 PM, Chris Green <cl at isbd.net> wrote:
> > > > I'm sure I'm missing something obvious here but I can't see an elegant
> > > > way to do this.  I want to create a directory, but if it exists it's
> > > > not an error and the code should just continue.
> > > >
> > > > So, I have:-
> > > >
> > > >     for dirname in listofdirs:
> > > >         try:
> > > >             os.mkdir(dirname)
> > > >         except FileExistsError:
> > > >             # so what can I do here that says 'carry on regardless'
> > > >         except:
> > > >             # handle any other error, which is really an error
> > > >
> > > >         # I want code here to execute whether or not dirname exists
> > > >
> > > >
> > > > Do I really have to use a finally: block?  It feels rather clumsy.
> > > >
> > > > I suppose I could test if the directory exists before the os.mkdir()
> > > > but again that feels a bit clumsy somehow.
> > > >
> > > > I suppose also I could use os.mkdirs() with exist_ok=True but again
> > > > that feels vaguely wrong somehow.
> > > >
> > >
> > > Why does exist_ok=True feel wrong to you?  This is exactly what it is
> > > there for.
> > >
> >
> > Using mkdirs when you only want to make one is inviting problems of
> > being subtly wrong, where it creates too many levels of directory.
> > Personally, I would just do:
> >
> > try: os.mkdir(dirname)
> > except FileExistsError: pass
> >
> > and not try to handle anything else at all.
> >
> Yes, OP here, that seems to me to be the 'right' way to do it.
> Basically I hadn't realised the effect of pass in a try block and
> that's why I asked the question originally.
>

There's two points to note here. "pass" doesn't do anything
whatsoever; it's only there to prevent the syntactic problem of having
nothing in that block. This will also suppress the error:

try:
    os.mkdir(dirname)
except FileExistsError:
    dummy = "ignore"

The second thing is that, as soon as you have an "except" clause that
matches the error, that's it - it stops there. The error is considered
handled at that point. If that's NOT what you want, you have a few
options. Firstly, you can simply not have a matching except clause.
That's why we like to be as precise as possible with our catching;
every other type of problem will be left uncaught. Secondly, you can
use "try/finally" to add code that happens as the exception flies by,
but doesn't catch it (it also happens at the end of the block for
other reasons). And thirdly, you can reraise the exception:

try:
    os.mkdir(dirname)
except FileExistsError:
    print("Hey, that one already exists!")
    raise

That's going to keep the exception going just as if it hadn't been
caught, but with the additional handling.

But if you don't do any of those things, the exception is deemed to be
handled, and it goes no further.

ChrisA


More information about the Python-list mailing list