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