获取异常的回溯而不重新抛出它们

5 投票
4 回答
3384 浏览
提问于 2025-04-17 09:54

我正在用Twister搭建一个服务器,同时也在维护一个服务器错误日志。问题是,如果我让一个异常(错误)一直向上抛出,它会导致当前的连接崩溃,用户就会断开连接。所以我当然会用一个简单的except来捕捉所有其他的错误。

一旦我捕捉到一个错误,有没有办法把错误的追踪信息(也就是错误发生的过程)作为字符串获取,这样我可以自己存储或者打印,而不是让Python在程序崩溃时自动打印出来?

4 个回答

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 )

这样做应该可以解决问题,并且还会打印出完整的错误信息。

1

使用日志模块,你可以把错误追踪信息记录到一个文件里:

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

traceback模块里有一些小工具,可以帮助我们打印和查看错误信息(比如,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 用来接收一个错误追踪对象...

你可以把sys.exc_traceback这个对象作为参数传给traceback.print_tb,这样就可以在except语句块中把错误信息打印到标准输出上。

撰写回答