Traceback抛出详细错误信息
Traceback抛出详细错误信息
1.概述
在python默认的抛出异常错误信息中给出的提示很少时不利于定位问题原因,需要一个详细的信息辅助定位问题,使用Traceback模块可以打印出详细的信息,下面来介绍如何使用这个模块。
2.Traceback模块
2.1.Traceback获取信息
在介绍Traceback模块前,先看一个python标准输出异常信息示例。在示例代码中定义了一个foo1函数,该函数抛出一个异常信息,main函数调用foo1函数时将异常输出。
def foo1():raise Exception("--foo1 exception--")def main():try:foo1()except Exception as e:print eif __name__ == '__main__':main()
运行代码查看它的输出结果
--foo1 exception--
示例中输出的错误信息非常的少,下面来看下如何获取更多的信息。
Traceback获取信息是通过函数sys.exc_info()来获取的,先来看一个例子。
import sysdef foo1():raise NameError("--foo1 exception--")def main():try:foo1()except Exception as e:exc_type, exc_value, exc_traceback_obj = sys.exc_info()print "exc_type: %s" % exc_typeprint "exc_value: %s" % exc_valueprint "exc_traceback_obj: %s" % exc_traceback_objif __name__ == '__main__':main()
运行查看结果
exc_type: <type 'exceptions.NameError'>
exc_value: --foo1 exception--
exc_traceback_obj: <traceback object at 0x879ddf5dji89>
sys.exc_info()获取了当前处理的exception的相关信息,并返回一个元组:
- 第一个数据是异常的类型(示例是NameError类型)
- 第二个返回值是异常的value值
- 第三个就是我们要的traceback object
有了traceback object我们就可以通过traceback来打印和格式化traceback的相关信息,下面我们就来看下traceback的相关函数
2.2.Traceback常用函数
1.print_tb
import sys
import tracebackdef foo1():raise NameError("--foo1 exception--")def main():try:foo1()except Exception as e:exc_type, exc_value, exc_traceback_obj = sys.exc_info()traceback.print_tb(exc_traceback_obj)if __name__ == '__main__':main()
运行查看结果
File "<ipython-input-23-52bdf2c9489c>", line 11, in mainfoo1()
File "<ipython-input-23-52bdf2c9489c>", line 6, in foo1raise NameError("--func1 exception--")
下面我们了解下print_tb函数详细信息
traceback.print_tb(tb[, limit[, file]])
- tb: 这个就是traceback object, 是我们通过sys.exc_info获取到的
- limit: 这个是限制stack trace层级的,如果不设或者为None,就会打印所有层级的stack trace
- file: 这个是设置打印的输出流的,可以为文件,也可以是stdout之类的file-like object。如果不设或为None,则输出到sys.stdout。
2.print_exception
import sys
import tracebackdef foo1():raise NameError("--func1 exception--")def foo2():func1()def main():try:foo2()except Exception as e:exc_type, exc_value, exc_traceback_obj = sys.exc_info()traceback.print_exception(exc_type, exc_value, exc_traceback_obj, limit=2, file=sys.stdout)if __name__ == '__main__':main()
运行结果
Traceback (most recent call last):File "<ipython-input-24-a68061acf52f>", line 13, in mainfoo2()File "<ipython-input-24-a68061acf52f>", line 9, in foo2foo1()
NameError: --foo1 exception--
print_exception函数介绍
traceback.print_exception(etype, value, tb[, limit[, file]])
跟print_tb相比多了两个参数etype和value,分别是exception type和exception value,加上tb(traceback object),正好是sys.exc_info()返回的三个值
与print_tb相比,打印信息多了开头的"Traceback (most…)“信息以及最后一行的异常类型和value信息
还有一个不同是当异常为SyntaxError时,会有”^"来指示语法错误的位置
3.print_exc
print_exc是简化版的print_exception, 由于exception type, value和traceback object都可以通过sys.exc_info()获取,因此print_exc()就自动执行exc_info()来帮助获取这三个参数了,也因此这个函数是我们的程序中最常用的,因为它足够简单
import sys
import tracebackdef foo1():raise NameError("--func1 exception--")def foo2():func1()def main():try:foo2()except Exception as e:exc_type, exc_value, exc_traceback_obj = sys.exc_info()traceback.print_exc(limit=1, file=sys.stdout)if __name__ == '__main__':main()
运行结果
Traceback (most recent call last):File "<ipython-input-25-a1f5c73b97c4>", line 13, in mainfoo2()
NameError: --foo1 exception--
4.format_exc
format_exc函数与print_exc函数功能是一样的,他们唯一的区别不是通过print打印异常信息,而是将异常信息记录到日志中。
import sys
import tracebackdef foo1():raise NameError("--func1 exception--")def foo2():func1()def main():try:foo2()except Exception as e:exc_type, exc_value, exc_traceback_obj = sys.exc_info()# 通过logger将异常信息记录到日志logger.error(traceback.format_exc(limit=1, file=sys.stdout))# 或者用下面的方式将异常信息封装成通用格式logger.error(f'输出失败异常:{e.__dict__},traceback={traceback.format_exc()}')if __name__ == '__main__':main()
2.3.获取线程中的异常信息
在多线程运行模式下,无法将多线程中的异常带回主线程,所以也就无法打印线程中的异常但是可以通过Traceback实现捕获线程异常
import threading
import tracebackdef my_func():raise BaseException("thread exception")class ExceptionThread(threading.Thread):def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None):"""Redirect exceptions of thread to an exception handler."""threading.Thread.__init__(self, group, target, name, args, kwargs, verbose)if kwargs is None:kwargs = {}self._target = targetself._args = argsself._kwargs = kwargsself._exc = Nonedef run(self):try:if self._target:self._target()except BaseException as e:import sysself._exc = sys.exc_info()finally:#Avoid a refcycle if the thread is running a function with#an argument that has a member that points to the thread.del self._target, self._args, self._kwargsdef join(self):threading.Thread.join(self)if self._exc:msg = "Thread '%s' threw an exception: %s" % (self.getName(), self._exc[1])new_exc = Exception(msg)raise new_exc.__class__, new_exc, self._exc[2]t = ExceptionThread(target=my_func, name='my_thread')
t.start()
try:t.join()
except:traceback.print_exc()
运行结果
Traceback (most recent call last):File "/data/code/testcode/thread_exc.py", line 43, in <module>t.join()File "/data/code/testcode/thread_exc.py", line 23, in runself._target()File "/data/code/testcode/thread_exc.py", line 5, in my_funcraise BaseException("thread exception")
Exception: Thread 'my_thread' threw an exception: thread exception
Traceback抛出详细错误信息相关推荐
- mvc4 renderpartial html,MVC4使用嵌套@ Html.RenderPartial()抛出编译器错误信息:CS1502...
我使用MVC 4,想整理一下我的看法了一点,所以决定创建多个局部视图和渲染过程中把他们聚在一起.MVC4使用嵌套@ Html.RenderPartial()抛出编译器错误信息:CS1502 这个工作原 ...
- caffe cmake matlab,编译caffe时候抛出的错误
编译caffe时候抛出的错误 我在安装ubuntu14.04上安装了cuda7.5,cudnn4.0等,使用起来都挺好的,没什么问题,最近,把21天实战caffe上面第五天的以来库都装完之后,准备装m ...
- Python使用try...except...输出详细错误信息(比如报错具体位置在第几行)
代码详情如下: # Python使用try...except...输出详细错误信息(比如报错具体位置在第几行)import sys import tracebacktry:print(1/1)pri ...
- php oracle 无查询结果,php - Oracle Insert查询不起作用,也不会抛出任何错误 - 堆栈内存溢出...
嗨,我是Oracle的新手. 我试图在PHP中使用oracle将记录插入表中. 但它不起作用,也没有抛出任何错误. 以下是我的代码. 请告诉我我做错了什么. $insertSQL= "INS ...
- 配置 IIS 7 显示详细错误信息
如果你在 IIS 7 中只看到诸如 HTTP Error 500 - Internal Server Error (500 - 内部服务器错误) 的简单错误信息,那么可以通过如下步骤配置 IIS7 以 ...
- 一个js文件 多个html文件怎么打开,通过PHP在PhantomJs中打开多个html文件抛出语法错误...
我想让我的php脚本从命令行调用phantomjs,这将从许多html文件中生成多个pdf.所以我有一个连接字符串与路径我的HTML文件,接下来我调用exec命令:通过PHP在PhantomJs中打开 ...
- getch计算机错误,为什么getch()在C中抛出一个错误
我正在Windows XP中的Code :: Blocks中运行一个C程序. 我得到一个错误为什么getch()在C中抛出一个错误 "drawing operation is attempe ...
- 西门子精简触摸屏编译出现内部错误,但没有详细错误信息的处理对策
西门子精简触摸屏编译出现内部错误,但没有详细错误信息的处理对策 如果项目在编译过程中报错,但是没有具体的报错信息,或者显示未知错误.我们可以尝试对项目做"软件–全部重建"操作.如下 ...
- 如何友好的处理 WebApi 中抛出的错误
微软的 ASP.NET Web API 是一个轻量级的web框架,可用来构建基于 http 无状态的rest服务,异常是一种运行时错误,异常处理是一种处理运行时错误的技术,每一个开发者都应该知道如何处 ...
最新文章
- 秒杀应用的MySQL数据库优化
- python将数字转变为中文读法-Python转换数字到中文大写格式
- mysql学习整理(一)
- 【BZOJ3252】攻略【闵可夫斯基和】【堆启发式合并】
- php做一个计算日期之间天数,PHP计算任意两个日期之间的天数
- 从源代码编译安装 Mono 2.4 和 MonoDevelop 2.0
- tensorflow错误记录:tf.concat
- 多线程的那点儿事(之自旋锁)
- mysql error 28,MySQL错误:Got error 28 from storage engine
- Python 日期时间处理
- how to set up github blog
- win10豆沙绿设置
- 房价与房租出现大幅“背离”?
- 芯片供应商:芯片一级供应商分类和安全芯片库存
- 国外的码农是什么状态?硅谷程序员:不加班,不穿女装
- 51单片机蜂鸣器操作
- linux c写的一个航班查询的程序
- 计算机操作系统唤醒原语,计算机操作系统原语分析(范文).doc
- 李开复台大演讲:人工智能来了,别怕
- html生成海报图片
热门文章
- 走进美国最传奇数据中心:顽抗飓风 曾承载97%的电话
- 计算机专业有纹身,“韩商言”身上也有纹身?得知背后的原因,无数粉丝暴风哭泣!...
- 《从零开始的 RPG 游戏制作教程》第九期:信息反馈(上)
- 2019 编程语言排行榜:Java、Python 龙争虎斗!PHP 屹立不倒!
- 感悟人生——佛家经典禅语
- Windows bat脚本学习二(命令窗口指令)
- ecshop 属性自动组合_传奇手游,神途自动升级,好混属性强大
- 【推荐】送给优柔寡断和胡思乱想的朋友们17条人生哲理
- poj1149迈克卖猪问题(PIGS)
- 2019年CSP-J2第一题:数字游戏(number)题解