Catching all exceptions in Python
In Python, what's the best way to catch "all" exceptions?
except: # do stuff with sys.exc_info()[1]
except BaseException as exc:
except Exception as exc:
The catch may be executing in a thread.
My aim is to log any exception that might be thrown by normal code without masking any special Python e开发者_StackOverflow社区xceptions, such as those that indicate process termination etc.
Getting a handle to the exception (such as by the clauses above that contain exc) is also desirable.
except Exception:vsexcept BaseException::The difference between catching
ExceptionandBaseExceptionis that according to the exception hierarchy exception like SystemExit, KeyboardInterrupt and GeneratorExit will not be caught when usingexcept Exceptionbecause they inherit directly fromBaseException.except:vsexcept BaseException::The difference between this two is mainly in python 2 (AFAIK), and it's only when using an old style class as an Exception to be raised, in this case only expression-less except clause will be able to catch the exception eg.
class NewStyleException(Exception): pass try: raise NewStyleException except BaseException: print "Caught" class OldStyleException: pass try: raise OldStyleException except BaseException: print "BaseException caught when raising OldStyleException" except: print "Caught"
If you need to catch all exceptions and do the same stuff for all, I'll suggest you this :
try:
#stuff
except:
# do some stuff
If you don't want to mask "special" python exceptions, use the Exception base class
try:
#stuff
except Exception:
# do some stuff
for some exceptions related management, catch them explicitly :
try:
#stuff
except FirstExceptionBaseClassYouWantToCatch as exc:
# do some stuff
except SecondExceptionBaseClassYouWantToCatch as exc:
# do some other stuff based
except (ThirdExceptionBaseClassYouWantToCatch, FourthExceptionBaseClassYouWantToCatch) as exc:
# do some other stuff based
The exception hierarchy from the python docs should be a usefull reading.
In order to avoid masking basic exceptions, you need to "re-raise" any exceptions which aren't the ones which you explicitly want to handle, e.g. (adapted from 8. Errors and Exceptions):
import systry: # do something that could throw an exception: except IOError as (errno, strerror): print "I/O error({0}): {1}".format(errno, strerror) except ValueError: print "Could not convert data to an integer." except: # maybe log the exception (e.g. in debug mode) # re-raise the exception: raise
加载中,请稍侯......
精彩评论