关于python:关于捕获任何ANY异常

About catching ANY exception

如何编写捕获所有异常的try/except块?


除了一个赤裸裸的except:条款(正如其他人所说,你不应该使用该条款),你只需抓住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.

通常情况下,如果您希望在终止前处理任何其他未捕获的异常,则只考虑在代码的最外层执行此操作。

与光秃秃的except相比,except Exception的优势在于它有一些无法捕获的例外,最明显的是KeyboardInterruptSystemExit:如果你捕获并吞下这些东西,那么任何人都很难退出脚本。


你可以,但你可能不应该:

1
2
3
4
try:
    do_something()
except:
    print"Caught it!"

但是,这也会捕获异常,如KeyboardInterrupt,而您通常不想这样做,是吗?除非您立即重新引发异常-请参阅文档中的以下示例:

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)"引发异常!"或者"一切看起来都很棒!"取决于是否引发了异常。

希望这有帮助!


要捕获所有可能的异常,请捕获BaseException。它位于异常层次结构的顶部:

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编码。这也会捕获许多您可能不想捕获的错误。