从异常中获取回溯而不重新提升它们

时间:2012-01-10 01:53:59

标签: python exception traceback

我正在使用Twister构建服务器。我也在维护服务器错误日志。问题是,如果我让异常一直向上运行,它会崩溃当前连接并断开用户连接,所以很明显我附加了一个裸,除了抓住其他所有内容。

一旦我发现了什么,是否有办法将回溯作为一个字符串,以便我可以将它存储在某个地方/自己打印而不提高它并让Python在程序崩溃时为我打印它?

4 个答案:

答案 0 :(得分:2)

traceback模块包含一些帮助函数,用于打印和检查回溯(对于exameble,traceback.print_tb) - 但重要的是回溯信息本身存储在“interpreter global”变量中 - sys.exc_traceback,on模块sys。

引自:

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子句中将回溯打印到stdout。

答案 1 :(得分:1)

使用logging module,您可log the traceback到文件:

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

答案 2 :(得分: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 )

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

答案 3 :(得分:0)

是的,那里有一个moduletraceback模块包含打印或格式化异常信息的函数,或返回原始堆栈帧的功能,以便您可以随意使用它们。

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