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
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 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:
However, it is generally bad practice to catch every error - see Why is "except: pass" a bad programming practice?
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
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
For completeness:
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
Also note that you can capture the exception like this:
>>> try:
... this_fails()
... except ZeroDivisionError as err:
... print("Handling run-time error:", err)
...and re-raise the exception like this:
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
Also, multiple exception types can be handled as a parenthesized tuple:
try:
i_might_fail()
except (ValueError, TypeError) as ex:
print('I failed with: ', ex)
...or as separate except clauses:
try:
i_might_fail()
except ValueError:
print('handling a ValueError...')
except TypeError:
print('handling a TypeError...')
...see the python tutorial.
I needed to ignore errors in multiple commands and fuckit did the trick
import fuckit
@fuckit
def helper():
print('before')
1/0
print('after1')
1/0
print('after2')
helper()
Well, this is not a try-except but still another way to handle exceptions if object-oriented programming is your thing:
class MyExceptionHandler:
def __enter__(self):
... # Do whatever when "with" block is started
return self
def __exit__(self, exc_type, exc_value, tb):
return True
And then to the actual code:
with MyExceptionHandler():
... # Code that may or may not raise an exception
shutil.rmtree(path)
How this works?
__enter__ is run when entering the with block.__exit__ is run when exiting the with block
True to silence the possible exception.None (or something which is considered False) to not silence the potential exception.As a final note, prefer try-except. This may be useful if you need more abstraction than usual.