How to properly ignore exceptions
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:
import errno
try:
shutil.rmtree(path)
except OSError as e:
if e.errno != errno.ENOENT:
# ignore "No such file or directory", but re-raise other errors
raise
try:
doSomething()
except Exception:
pass
or
try:
doSomething()
except:
pass
The difference is that the second one will also catch KeyboardInterrupt
, SystemExit
and stuff like that, which are derived directly from BaseException
, not Exception
.
See documentation for details:
try
statement- exceptions
However, it is generally bad practice to catch every error - see Why is "except: pass" a bad programming practice?