Python - Conditionally Catching Exceptions
You can re-raise the exception if you don't want to handle it:
def my_func(my_arg, handle_exceptions):
try:
do_something(my_arg)
except Exception, e:
if not handle_exceptions:
# preserve prior stack trace
raise
# Or, if you dont care about the stack prior to this point
#raise Exception(e)
# similarly, you can just re-raise e. The stack trace will start here though.
#raise e
else:
print "my_func is handling the exception"
Another option is to create your own exceptions that subclass Exception
(or a specific exception like urllib2.HTTPError
) and then only catch/throw (raise
) your custom exception:
class MyException(Exception):
def __init__(self, message):
self.message = message
class MyExceptionTwo(Exception):
def __init__(self, message):
self.message = message
def __repr__(self):
return "Hi, I'm MyExceptionTwo. My error message is: %s" % self.message
def something():
if not tuesday:
raise MyException("Error: it's not Tuesday.")
else:
raise MyExceptionTwo("Error: it's Tuesday.")
def my_func(my_arg):
try:
something()
except MyException, e:
print e.message
# Will pass MyExceptionTwo up the call chain
def my_other_func():
try:
my_func(your_arg)
except MyExceptionTwo, e:
print str(e)
# No need to catch MyException here since we know my_func() handles it
# but we can hadle MyExceptionTwo here
The question just doesn't have enough answers ;-)
Here's one more for the record books. Just create a dummy exception:
class NeverMatch(Exception):
'An exception class that is never raised by any code anywhere'
Then, use a conditional expression to decide whether to match the real exception or the placeholder exception (which never gets raised):
try:
do_something(my_arg)
except (Exception if handle_exceptions else NeverMatch) as e:
print 'I am handling it'
You can use:
def my_func(my_arg, handle_exceptions):
try:
do_something(my_arg);
except Exception as e:
if not handle_exceptions: raise
print "my_func is handling the exception";