Python:关于捕获任何exception
如何写一个try
/ except
块来捕获所有exception?
你可以,但你不应该:
try: do_something() except: print "Caught it!"
但是,这也将捕获像KeyboardInterrupt
exception,你通常不希望这样做,是吗? 除非您立即重新提出exception – 请参阅文档中的以下示例:
try: f = open('myfile.txt') s = f.readline() i = int(s.strip()) 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: print "Unexpected error:", sys.exc_info()[0] raise
除了一个裸的except:
子句(正如其他人所说,你不应该使用),你可以简单地捕捉Exception
:
import traceback import logging try: whatever() except Exception as e: logging.error(traceback.format_exc()) # Logs the error appropriately.
您通常只会考虑在代码的最外层执行此操作,例如,如果您想在终止之前处理任何其他未捕获的exception。
except Exception
的优点, except Exception
有一些例外,它不会被捕获,最明显的是KeyboardInterrupt
和SystemExit
:如果你抓住并吞下那些,那么你可以让任何人都难以退出你的脚本。
你可以这样做来处理一般的例外
try: a = 2/0 except Exception as e: print e.__doc__ print e.message
非常简单的例子,类似于这里find的一个:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
如果您试图捕获所有exception,则将所有代码放在“try:”语句中,而不是“打印”执行可能会引发exception的操作。
try: print "Performing an action which may throw an exception." except Exception, error: print "An exception was thrown!" print str(error) else: print "Everything looks great!" finally: print "Finally is called directly after executing the try statement whether an exception is thrown or not."
在上面的例子中,你会看到输出顺序:
1)执行可能抛出exception的动作。
2)最后在执行try语句后直接调用是否抛出exception。
3)“抛出exception!” 或者“一切看起来很棒!” 取决于是否抛出exception。
希望这可以帮助!
要捕获所有可能的exception,请捕获BaseException
。 它位于Exception层次结构的顶部:
Python 3: https : //docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7: https : //docs.python.org/2.7/library/exceptions.html#exception-hierarchy
try: something() except BaseException as error: print('An exception occurred: {}'.format(error))
但正如其他人所说,除非你有一个很好的理由,否则通常不应该这样做。
我刚刚发现了这个testingPython 2.7中的exception名称的小技巧。 有时我已经在代码中处理了特定的exception,所以我需要一个testing,看看这个名字是否在处理的exception列表中。
try: raise IndexError #as test error except Exception as e: excepName = type(e).__name__ # returns the name of the exception
try: whatever() except: # this will catch any exception or error
值得一提的是这不是正确的Python编码。 这也会捕捉到许多你可能不想捕捉的错误。