我正在使用 Twister 构建服务器。我还在维护一个服务器错误日志。问题是,如果我让异常在堆栈中一直运行,它将使当前连接崩溃并断开用户连接,所以显然我附加了一个裸露的,除了抓住其他一切。
一旦我抓住了一些东西,有没有办法将回溯作为字符串获取,这样我就可以将它存储在某个地方/自己打印它而无需提升它并让 Python 在程序崩溃时为我打印它?
回溯模块包含一些用于打印和检查回溯的辅助函数(例如 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 子句中将回溯打印到标准输出。
尝试这个:
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 )
这应该可以解决问题并打印完整的堆栈跟踪。
是的,有一个模块。该traceback
模块包含打印或格式化异常信息或返回原始堆栈帧的函数,以便您可以对它们做任何您想做的事情。
不过,对于一个相当复杂的应用程序,我实际上建议使用日志系统而不是普通的旧traceback
函数。特别是,该方法logging.Logger.exception
会将有关异常的信息写入您(或您的软件用户)已配置的任何日志记录目标。默认格式化程序只会打印出回溯,就像 Python 在控制台上一样,但您可以通过创建Formatter
并覆盖该format_exception
方法来自定义日志中异常的显示。traceback
如果您需要函数来格式化异常输出,则覆盖的方法是调用函数的地方。