在Python中引发基于非异常的异常会产生不同的结果
我刚刚注意到,以下用Python2.x编写的代码除了-块之外没有进入在Python中引发基于非异常的异常会产生不同的结果,python,python-2.7,exception-handling,Python,Python 2.7,Exception Handling,我刚刚注意到,以下用Python2.x编写的代码除了-块之外没有进入 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__.
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>
Exception
输出
Traceback (most recent call last): File "main.py", line 5, in
<module>
raise MyException()
__main__.MyException: <__main__.MyException instance at 0x021E9DC8>
Exception
例如,raise0
表达式也是如此
为什么??这背后的原因是什么?至少对于python 2.7来说:
raise'str'
和raise 0
都将引发TypeError
。这将由代码中的异常除外分支处理
由于您自己的类MyException
不继承自Exception
,因此永远不会执行Exception
分支。你仍然可以做:
try:
raise MyException()
except MyException:
print('Exception')
在您的示例中,sys.excepthook
(顶级异常处理程序)打印了输出\uuuu main\uuuu.MyException:
,因为您从未捕获到异常。我无法回答为什么Python2会以这种方式结束,但它在Python3中发生了更改,无法再引发不从BaseException
继承的对象。即使你确实弄明白了确切的逻辑,我也不建议你在以后需要维护的任何代码中使用它。为什么对于整数和字符串这样的类型,它是TypeError
,而对于不是从Exception
class?继承的用户定义类,它不是,您应该得到TypeError:异常必须是旧式类或从BaseException派生的,而不是int