Python确定是否抛出异常(无论是否被捕获)

时间:2016-11-01 19:42:32

标签: python

我正在编写一些遗留代码的测试,这些代码充斥着像

这样的全能结构
try:
    do_something()
    do_something_else()

    for x in some_huge_list():
        do_more_things()

except Exception:
    pass

我想知道是否在try块中抛出异常。

我想避免在代码库中引入更改只是为了支持一些测试,我不想让except个案例更具体,因为担心会无意中引入回归。

有没有办法提取有关从运行时引发并随后处理的异常的信息?或者某些具有与eval / exec / apply / call类似的API的函数,它们记录每个引发的异常的信息,让用户提供一个运行的异常处理程序首先,或者让用户注册一个回调,该回调在诸如引发或捕获的异常之类的事件上运行。

如果没有办法检测是否在没有以非常讨厌的方式进入(C)Python运行时的情况下抛出异常,那么在您单元内部使用catch-all异常测试代码的一些好策略是什么?重新测试?

2 个答案:

答案 0 :(得分:2)

唯一可行的选择是检测except处理程序。

Python会记录异常信息,可以使用sys.exc_info()检索,但是当函数退出(Python 2)或try语句完成时,此信息清除( Python 3)。

答案 1 :(得分:-1)

一个好的策略是测试可观察的行为。由于异常被明确排除在可观察行为之外,我认为您不应该测试是否引发了异常。