如何使用“if”语句测试异常对象



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

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,我会错过异常吗?

函数返回异常而不是引发异常或让它们冒泡是一件坏事。

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

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

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")
这使得异常来自

何处(函数)更加清晰,并避免了尝试返回异常的混乱 - 毕竟,异常通常意味着被捕获而不是返回。

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

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

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

最新更新