如何使用`if`语句测试异常对象?

时间:2016-06-08 02:59:45

标签: python exception

如果我事先不知道引发了什么类型的异常,我如何测试函数是否返回了异常对象?

def func():
    try:
        bad_thing_happens  # NameError("global name 'bad_thing_happens' is not defined",)
        return True
    except Exception as e:
        return e

result = func()
if result == Exception:
    print 'a bad thing happened'

在这种情况下,if语句返回False,我会错过该异常吗?

3 个答案:

答案 0 :(得分:6)

函数返回异常而非提升或让它们冒泡是一件坏事。

也就是说,您可以使用isinstance(object, klass)测试对象是否是类的实例。

答案 1 :(得分:5)

正确的方法是在函数之外捕获异常。例如:

def func():
    bad_thing_happens
    # NameError("global name 'bad_thing_happens' is not defined",)
    return True

try:
    result = func()
except NameError:
    print("a bad thing happened")

这使得异常来自(函数)的位置更加清晰,并避免了尝试返回异常的混乱 - 毕竟,异常通常意味着被捕获而不返回。

答案 2 :(得分:2)

如果由于某种原因无法更改func()(例如,它是第三方库代码的一部分),您可以通过isinstance()检查返回值的类型:< / p>

if isinstance(result, Exception):
    print 'a bad thing happened'

如果您可以更改func(),那么您不应该返回异常 - 它们应该被引发(并重新引发),捕获和处理(并且不会被处理)。