【问题标题】:Raising non-Exception based exceptions in Python gives different results在 Python 中引发基于非异常的异常会产生不同的结果
【发布时间】:2015-11-01 19:30:43
【问题描述】:

我刚刚注意到以下用 Python 2.x 编写的代码没有进入 except-block

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 表达式也是如此。

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

【问题讨论】:

  • 我无法回答为什么 Python 2 会以这种方式结束,但它在 Python 3 中已经发生了变化,您不能再引发不继承自 BaseException 的对象。即使您确实弄清楚了确切的逻辑,我也不建议在您需要维护的任何代码中使用它。

标签: python python-2.7 exception-handling


【解决方案1】:

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

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

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

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

【讨论】:

  • 为什么它是TypeError 用于整数和字符串等类型,而不是用于不从Exception 类继承的用户定义类?
  • @FrozenHeart 尝试在交互式 shell 中引发 0,你应该得到 TypeError: exceptions must be old-style classes or derived from BaseException, not int
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2017-12-07
  • 2020-06-20
  • 2019-01-26
  • 1970-01-01
相关资源
最近更新 更多