【问题标题】:Why does Python often separate the exception type and value (exc_info, __exit__, etc)?为什么 Python 经常将异常类型和值(exc_info、__exit__ 等)分开?
【发布时间】:2017-05-17 18:27:28
【问题描述】:

traceback.format_exception_only 有参数(etype, value)。如果我有一个要格式化的异常e,在什么情况下我不想调用format_exception_only(type(e), e)

sys.exc_info 返回类型、值和回溯。上下文管理器的__exit__ 方法具有与参数相同的三件事。类型不是多余的吗?可以等于type(value)以外的东西吗?

【问题讨论】:

    标签: python exception exception-handling traceback


    【解决方案1】:

    历史原因。

    早在 1.x 时代,这些信息并没有全部捆绑在一个对象中。异常类型是 string(!) 而不是类,值是任意对象,并且回溯未附加到这些对象中的任何一个。所有type, value, traceback API 都是围绕这种设计构建的,其中这些对象必须单独传递:

    MyException = "MyException"
    
    raise MyException, 3
    

    在 1.x 行 (I think 1.2) 中的某些时候,他们添加了基于类的异常,在 2.x 行中的某些时候(我认为是 2.6,因为 2.5 branch 代码路径似乎只会引发警告),字符串异常已被删除,但旧的函数签名仍然存在。

    【讨论】:

    • “回溯未附加到这些对象中的任何一个”不是仍然如此吗?
    • @AlexHall:在 Python 3 中,回溯可作为异常对象的 __traceback__ 属性使用。
    • 呵呵,没想到。 python 2 文档警告说,通过存储回溯创建的循环效率低下。 Python 3 中的新属性是否会影响效率,还是很神奇?
    • @AlexHall:正如PEP 3110 中指定的那样,当控制离开except 块时,Python 3 将自动del 目标except 打破循环。
    【解决方案2】:

    早在 1.x 天,Python 就曾允许字符串对象作为例外。与Exception 实例不同,字符串没有参数。

    字符串异常在 1.5 中被弃用,并在 2.0 2.6 中被移除。从那以后,我想它只是向后兼容。这不是一个足以命令重大更改的问题。

    【讨论】:

    • Python 3 应该是进行重大更改的时候了。
    • @MarkRansom:对于 一些 重大更改,而不是“破坏所有内容”更改。即使没有它,它也破坏了足够多的东西以产生非常缓慢的接受曲线。用于回溯访问的低级 API 很少使用,主要由框架、调试器、分析器等的开发人员使用。打破它将使新生的 Python 3 在一段时间内没有这些可能非常重要的工具;没有该死的充分理由,这可能不值得这样做。
    • 2.0 仍然有字符串异常。我认为它们仅在 2.6 中被完全删除; 2.5 branch 仍然在 raise 实现中处理它们,DeprecationWarning
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多