TGTGInsighttelegram intelligenceLIVE / telegram public index
Post content
帖子内容
Python traceback 格式化一个异常的调用栈时,可以要求带上每一个栈帧的所有局部变量。这对于事后理解异常是怎么发生的很有帮助,许多软件(例如 Django 在 debug 模式中)也有类似的设计,会显示局部变量。 然而,Python 3.12 之前,这个功能不会处理 repr 局部变量时产生的异常。只要任何一个栈帧的任何一个局部变量无法 repr,就会失败并报错。在我看来这是不可理喻的,因为服务器软件有需求捕获所有异常,记录尽可能丰富的调试信息,然后恢复并继续运行,这要求捕获异常和记录逻辑必须保证不产生新的异常(除非是内存不足等本来也没法继续运行的严重错误)。 异常处理、日志记录等功能都应当尽可能防御所有异常,在异常时执行一些备用逻辑,例如格式化失败时可以记录“发生了无法格式化的异常”。如果这些功能本身能抛出异常,导致服务器程序停机,让用户怎么办呢?只好自己在外面再手写一套保证不抛出异常的备用逻辑。 2021 年 3 月有人提这个 issue[1],2022 年 7 月改了[2],2023 年 10 月终于在 3.12 发布了。issue 中开发者反对的理由主要是认为 repr 抛出异常是程序自己的问题,并且 Python 不应该静默忽略异常,怎么说呢……有一些道理,但站在服务器程序开发者的角度感觉挺坑的。 [1]: https://bugs.python.org/issue43656 [2]: https://github.com/python/cpython/pull/94691