How to 'ignore' an error in Python?

Phu Sam psam1304 at gmail.com
Sat Apr 29 23:28:59 EDT 2023


Unsubscribe

On Sat, Apr 29, 2023 at 7:05 PM Chris Angelico <rosuav at gmail.com> wrote:

> 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
> --
> https://mail.python.org/mailman/listinfo/python-list
>


More information about the Python-list mailing list