How to properly ignore Exceptions?
When you just want to do a try-except without handling the exception, how do you do it in Python?
Is the following the right way to do it?
try:
shutil.rmtree(path)
except:
pass
try:
doSomething()
except:
pass
or
try:
doSomething()
except Exception:
pass
The difference is, that the first one will also catch KeyboardInterrupt
, SystemExit
and stuff like that, which are derived directly from exceptions.BaseException
, not exceptions.Exception
.
See documentation for details:
It's generally considered best-practice to only catch the errors you are interested in. In the case of shutil.rmtree
it's probably OSError
:
>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
[...]
OSError: [Errno 2] No such file or directory: '/fake/dir'
If you want to silently ignore that error, you would do:
try:
shutil.rmtree(path)
except OSError:
pass
Why? Say you (somehow) accidently pass the function an integer instead of a string, like:
shutil.rmtree(2)
It will give the error "TypeError: coercing to Unicode: need string or buffer, int found" - you probably don't want to ignore that, which can be difficult to debug.
If you definitely want to ignore all errors, catch Exception
rather than a bare except:
statement. Again, why?
Not specifying an exception catches every exception, including the SystemExit
exception which for example sys.exit()
uses:
>>> try:
... sys.exit(1)
... except:
... pass
...
>>>
Compare this to the following, which correctly exits:
>>> try:
... sys.exit(1)
... except Exception:
... pass
...
shell:~$
If you want to write ever better behaving code, the OSError
exception can represent various errors, but in the example above we only want to ignore Errno 2
, so we could be even more specific:
try:
shutil.rmtree(path)
except OSError, e:
if e.errno == 2:
# suppress "No such file or directory" error
pass
else:
# reraise the exception, as it's an unexpected error
raise
You could also import errno
and change the if
to if e.errno == errno.ENOENT:
When you just want to do a try catch without handling the exception, how do you do it in Python?
It depends on what you mean by "handling."
If you mean to catch it without taking any action, the code you posted will work.
If you mean that you want to take action on an exception without stopping the exception from going up the stack, then you want something like this:
try:
do_something()
except:
handle_exception()
raise #re-raise the exact same exception that was thrown
链接地址: http://www.djcxy.com/p/4392.html
上一篇: 在Python中手动提高(抛出)异常
下一篇: 如何正确地忽略异常?