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
try: doSomething() except Exception: pass
The difference is, that the first one will also catch
SystemExit and stuff like that, which are derived directly from
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
>>> 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:
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
>>> 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 e.errno == errno.ENOENT: