如果未引发异常,则sys.last_type
,sys.last_value
和sys.last_traceback
未定义:
import sys
hasattr(sys, 'last_type')
hasattr(sys, 'last_value')
hasattr(sys, 'last_traceback')
返回:
False
False
False
在某个地方引发异常后,所有这些值都可以访问。
我的问题:del
这些值是否安全?
del sys.last_type
del sys.last_value
del sys.last_traceback
我的Python版本是Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
UPD :更多信息。我正在使用Python C API编写C应用程序。用户逐行输入Python代码,而我使用Python C API来执行它。每次通话后,我想检查是否发生异常(通过获取hasattr(sys, "last_type")
),如果是,则将异常显示给用户(通过sys.last_type
,sys.last_value
和sys.last_traceback
)。
之后,我想清理sys.last_type
,sys.last_value
和sys.last_traceback
,以便稍后可以再次检查它们是否由某些新异常重新创建,然后再次将此信息返回给用户。有道理吗?
答案 0 :(得分:2)
是的,您可以放心del
这些属性。但是:
每次通话后,我想检查是否发生异常...
在这种情况下,您应该调整代码以直接查看sys.exc_info()
。 last_type
,last_value
和last_traceback
只是未处理异常的副作用-它们旨在用于交互式会话中,而不是用于流控制。
存在用于清除最后一个异常信息的合法用例。如此之多,Python 2为此具有helper function:
>>> print(sys.exc_clear.__doc__)
exc_clear() -> None
Clear global information on the current exception. Subsequent calls to
exc_info() will return (None,None,None) until another exception is raised
in the current thread or the execution stack returns to a frame where
another exception is being handled.
从文档中
仅在少数情况下才需要此功能。这些包括日志记录和错误处理系统,它们报告有关上一个或当前异常的信息。此功能也可用于尝试释放资源并触发对象完成,尽管无法保证将释放哪些对象(如果有)。
在Python 3.0库更改中将其删除: