4

我正在使用 Twister 构建服务器。我还在维护一个服务器错误日志。问题是,如果我让异常在堆栈中一直运行,它将使当前连接崩溃并断开用户连接,所以显然我附加了一个裸露的,除了抓住其他一切。

一旦我抓住了一些东西,有没有办法将回溯作为字符串获取,这样我就可以将它存储在某个地方/自己打印它而无需提升它并让 Python 在程序崩溃时为我打印它?

4

4 回答 4

2

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

引用自:

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

在一个 except 子句的套件执行之前,有关异常的详细信息被分配给 sys 模块中的三个变量: sys.exc_type 接收标识异常的对象;sys.exc_value 接收异常的参数;sys.exc_traceback 接收回溯对象...

您可以将 sys.exc_traceback 对象作为参数传递给 traceback.print_tb 以在 except 子句中将回溯打印到标准输出。

于 2012-01-10T02:07:15.160 回答
1

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

import logging
logging.basicConfig(level = logging.DEBUG, filename = logfile)
logger = logging.getLogger(__name__)
try:
    1/0
except ZeroDivisionError as err:
    logger.exception(err)
于 2012-01-10T02:03:44.433 回答
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 )

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

于 2012-01-10T02:12:00.420 回答
0

是的,有一个模块。该traceback模块包含打印或格式化异常信息或返回原始堆栈帧的函数,以便您可以对它们做任何您想做的事情。

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

于 2012-01-10T02:03:07.227 回答