About catching ANY exception
如何编写捕获所有异常的
除了一个赤裸裸的
1 2 3 4 5 6 7 8 | import traceback import logging try: whatever() except Exception as e: logging.error(traceback.format_exc()) # Logs the error appropriately. |
通常情况下,如果您希望在终止前处理任何其他未捕获的异常,则只考虑在代码的最外层执行此操作。
与光秃秃的
你可以,但你可能不应该:
1 2 3 4 | try: do_something() except: print"Caught it!" |
但是,这也会捕获异常,如
1 2 3 4 5 6 7 8 9 10 11 | 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 |
您可以这样做来处理一般异常
1 2 3 4 5 | try: a = 2/0 except Exception as e: print e.__doc__ print e.message |
非常简单的例子,类似于这里的例子:
http://docs.python.org/tutorial/errors.html定义清理操作
如果您试图捕获所有异常,那么将所有代码放在"try:"语句中,而不是"print"执行可能引发异常的操作。""。
1 2 3 4 5 6 7 8 9 | 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)执行可能引发异常的操作。
2)finally在执行try语句后直接调用,无论是否引发异常。
3)"引发异常!"或者"一切看起来都很棒!"取决于是否引发了异常。
希望这有帮助!
要捕获所有可能的异常,请捕获
Python 3:https://docs.python.org/3.5/library/exceptions.html异常层次结构
Python 2.7:https://docs.python.org/2.7/library/exceptions.html异常层次结构
1 2 3 4 | try: something() except BaseException as error: print('An exception occurred: {}'.format(error)) |
但是正如其他人提到的,你通常不应该这样做,除非你有一个很好的理由。
我刚刚发现了在Python2.7中测试异常名称的小技巧。有时,我在代码中处理了特定的异常,所以我需要一个测试来查看该名称是否在已处理异常的列表中。
1 2 3 4 | try: raise IndexError #as test error except Exception as e: excepName = type(e).__name__ # returns the name of the exception |
有多种方法可以做到这一点,特别是使用Python3.0及更高版本。
方法1
这是一种简单的方法,但不推荐使用,因为您不知道到底是哪一行代码实际引发了异常:
1 2 3 4 5 6 7 | def bad_method(): try: sqrt = 0**-1 except Exception as e: print(e) bad_method() |
方法2
建议使用此方法,因为它提供了有关每个异常的更多详细信息。它包括:
- 代码的行号
- 文件名
- 以更详细的方式显示实际错误
唯一的缺点是traback需要导入。
1 2 3 4 5 6 7 8 9 | import traceback def bad_method(): try: sqrt = 0**-1 except Exception: print(traceback.print_exc()) bad_method() |
1 2 3 4 | try: whatever() except: # this will catch any exception or error |
值得一提的是,这不是正确的Python编码。这也会捕获许多您可能不想捕获的错误。