Granularity of OSError
Sean DiZazzo
half.italian at gmail.com
Fri Sep 18 15:05:13 EDT 2009
On Sep 18, 11:54 am, kj <no.em... at please.post> wrote:
> I've often come across the idea that good Python style deals with
> potential errors using an EAFP ("easier to ask forgiveness than
> permission") strategy rather than a LBYL ("look before you leap")
> strategy.
>
> For example, LBYL would look like this:
>
> if os.path.isfile(some_file):
> os.unlink(some_file)
>
> In contrast, EAFP would look like this:
>
> try:
> os.unlink(some_file)
> except OSError:
> pass
>
> But, as written, the EAFP code above is not satisfactory, because
> there can be OSError's triggered for reasons other than the
> non-existence of the regular file some_file.
>
> What one needs is a finer granularity of exception, mapping to
> exactly the error that one is guarding against.
>
> Is there a standard approach to refining the granularity of exceptions
> such as OSError? The only approach I can think of is to somehow
> parse the error string (assuming is available) to determine whether
> the exception is indeed of the specific kind we're trying to catch.
> But this strikes me as grossly inelegant. Is there a better way?
>
> (BTW, the problem is generic, because client code has no control
> over the specificity of the exceptions raised by a library module.
> If these exceptions turn out to be too broad, client code has to
> somehow deal with this reality, at least in the short term.)
>
> TIA!
>
> kynn
You can access the exception object which gives you greater detail.
try:
os.unlink(some_file)
except OSError, e:
print e.errno
print e.strerror
if e.errno == 2:
pass
else:
raise
If it's the error you are looking for, handle it, or else raise.
~Sean
More information about the Python-list
mailing list