Python 在不重新引发异常的情况下从异常获取回溯

Python 在不重新引发异常的情况下从异常获取回溯,python,exception,traceback,Python,Exception,Traceback,我正在使用Twister构建一个服务器。我还在维护服务器错误日志。问题是,如果我让一个异常一直运行到堆栈上,它将使当前连接崩溃并断开用户连接,因此很明显,我会附加一个裸露的异常来获取其他所有内容 一旦我捕获了某个东西,是否有办法将回溯作为字符串,这样我就可以将它存储在某个地方/自己打印它,而不必在程序崩溃时提升它并让Python为我打印它?是的,有一个解决方案。traceback模块包含打印或格式化异常信息的函数,或返回原始堆栈帧的函数,以便您可以对其执行任何操作 不过,对于一个相当复杂的应用程

我正在使用Twister构建一个服务器。我还在维护服务器错误日志。问题是,如果我让一个异常一直运行到堆栈上,它将使当前连接崩溃并断开用户连接,因此很明显,我会附加一个裸露的异常来获取其他所有内容

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

是的,有一个解决方案。
traceback
模块包含打印或格式化异常信息的函数,或返回原始堆栈帧的函数,以便您可以对其执行任何操作

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

使用,您可以:

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

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

引述自:

在执行except子句的套件之前,有关 将异常分配给sys模块中的三个变量: sys.exc_type接收标识异常的对象; sys.exc_值接收异常的参数;sys.exc_回溯 接收回溯对象

您可以将sys.exc\u traceback对象作为参数传递给traceback.print\u 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 )
这样就可以打印完整的堆栈跟踪了