在Python中引发基于非异常的异常会产生不同的结果

时间:2015-11-01 19:30:43

标签: python python-2.7 exception-handling

我刚才注意到以下用Python 2.x编写的代码没有转到except - 块

class MyException:
    pass

try:
    raise MyException()
except Exception:
    print('Exception')

输出

Traceback (most recent call last):   File "main.py", line 5, in
<module>
    raise MyException()
__main__.MyException: <__main__.MyException instance at 0x021E9DC8>

,而以下代码执行:

try:
    raise 'str'
except Exception:
    print('Exception')

输出

Exception

例如,raise 0表达式也是如此。

为什么呢?这背后的原因是什么?

1 个答案:

答案 0 :(得分:2)

至少对于python 2.7: raise 'str'raise 0都会提升TypeError。这将由代码中的except Exception分支处理。

由于您自己的类MyException未从Exception继承,因此永远不会执行except分支。你仍然可以这样做:

try:
     raise MyException()
except MyException:
     print('Exception')

在您的示例中,输出__main__.MyException: <__main__.MyException instance at 0x021E9DC8>sys.excepthook(顶级异常处理程序)打印,因为您从未捕获过异常。