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

在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__.

我刚刚注意到,以下用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__.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