删除sys.last_ *变量是否安全?

时间:2019-01-15 20:46:46

标签: python python-3.x

如果未引发异常,则sys.last_typesys.last_valuesys.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_typesys.last_valuesys.last_traceback)。 之后,我想清理sys.last_typesys.last_valuesys.last_traceback,以便稍后可以再次检查它们是否由某些新异常重新创建,然后再次将此信息返回给用户。有道理吗?

1 个答案:

答案 0 :(得分:2)

是的,您可以放心del这些属性。但是:

  

每次通话后,我想检查是否发生异常...

在这种情况下,您应该调整代码以直接查看sys.exc_info()last_typelast_valuelast_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库更改中将其删除:

https://docs.python.org/3/whatsnew/3.0.html#library-changes