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