如果我事先不知道引发了什么类型的异常,如何测试函数是否返回了异常对象?
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()
,那么您不应该返回异常 - 它们旨在被引发(和重新引发),捕获和处理(以及不处理)。