从异常中获取回溯信息而不重新引发异常

5
我正在使用Twister构建服务器。同时我也在维护服务器的错误日志。问题在于,如果我让一个异常一路运行到栈底,它将会导致当前连接崩溃并断开用户的连接,因此我显然会附加一个裸的except来捕获其他所有异常。
一旦我捕获了某些异常,是否有一种方法将回溯作为字符串获取,以便我可以存储它或自己打印它,而不会引发它并让Python在程序崩溃时为我打印?
4个回答

2
追溯模块包含一些辅助函数,用于打印和检查追溯信息(例如 traceback.print_tb)- 但重要的是,追溯信息本身存储在一个“解释器全局”变量sys.exc_traceback中,该变量位于sys模块中。
引用自:

http://docs.python.org/reference/compound_stmts.html#try

在执行 except 子句的语句块之前,sys 模块会将有关异常的详细信息分配给三个变量:sys.exc_type 接收标识异常的对象;sys.exc_value 接收异常的参数;sys.exc_traceback 接收一个 traceback 对象...您可以将 sys.exc_traceback 对象作为参数传递给 traceback.print_tb 函数,在 except 子句中将 traceback 打印到 stdout。

1

使用日志模块,你可以将回溯信息记录到文件中:

import logging
logging.basicConfig(level = logging.DEBUG, filename = logfile)
logger = logging.getLogger(__name__)
try:
    1/0
except ZeroDivisionError as err:
    logger.exception(err)

1

试试这个:

import traceback, sys

try:
    # Do something that might raise an exception
    open("/does not exist",'rb')
except:
    traceback.print_exc( file=sys.stderr )
    # Or 
    traceback.print_exc( file=your_open_log_file )

这应该可以解决问题,并打印完整的堆栈跟踪。


0

没错,有一个模块可以做到这一点。 traceback 模块包含打印或格式化异常信息的函数,或者返回原始堆栈帧,以便您可以对它们进行任何操作。

对于一个相当复杂的应用程序,我实际上建议使用日志记录系统,而不是普通的 traceback 函数。特别是方法 logging.Logger.exception 将向您(或您软件的用户)配置的任何日志记录目标写入有关异常的信息。默认格式化程序将只打印出回溯,就像 Python 在控制台上一样,但是您可以通过创建 Formatter 并覆盖 format_exception 方法来自定义日志中的异常显示。如果您需要使用它们来格式化异常输出,则重写的方法是调用 traceback 函数的地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接