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抛出详细错误信息相关推荐

  1. mvc4 renderpartial html,MVC4使用嵌套@ Html.RenderPartial()抛出编译器错误信息:CS1502...

    我使用MVC 4,想整理一下我的看法了一点,所以决定创建多个局部视图和渲染过程中把他们聚在一起.MVC4使用嵌套@ Html.RenderPartial()抛出编译器错误信息:CS1502 这个工作原 ...

  2. caffe cmake matlab,编译caffe时候抛出的错误

    编译caffe时候抛出的错误 我在安装ubuntu14.04上安装了cuda7.5,cudnn4.0等,使用起来都挺好的,没什么问题,最近,把21天实战caffe上面第五天的以来库都装完之后,准备装m ...

  3. Python使用try...except...输出详细错误信息(比如报错具体位置在第几行)

     代码详情如下: # Python使用try...except...输出详细错误信息(比如报错具体位置在第几行)import sys import tracebacktry:print(1/1)pri ...

  4. php oracle 无查询结果,php - Oracle Insert查询不起作用,也不会抛出任何错误 - 堆栈内存溢出...

    嗨,我是Oracle的新手. 我试图在PHP中使用oracle将记录插入表中. 但它不起作用,也没有抛出任何错误. 以下是我的代码. 请告诉我我做错了什么. $insertSQL= "INS ...

  5. 配置 IIS 7 显示详细错误信息

    如果你在 IIS 7 中只看到诸如 HTTP Error 500 - Internal Server Error (500 - 内部服务器错误) 的简单错误信息,那么可以通过如下步骤配置 IIS7 以 ...

  6. 一个js文件 多个html文件怎么打开,通过PHP在PhantomJs中打开多个html文件抛出语法错误...

    我想让我的php脚本从命令行调用phantomjs,这将从许多html文件中生成多个pdf.所以我有一个连接字符串与路径我的HTML文件,接下来我调用exec命令:通过PHP在PhantomJs中打开 ...

  7. getch计算机错误,为什么getch()在C中抛出一个错误

    我正在Windows XP中的Code :: Blocks中运行一个C程序. 我得到一个错误为什么getch()在C中抛出一个错误 "drawing operation is attempe ...

  8. 西门子精简触摸屏编译出现内部错误,但没有详细错误信息的处理对策

    西门子精简触摸屏编译出现内部错误,但没有详细错误信息的处理对策 如果项目在编译过程中报错,但是没有具体的报错信息,或者显示未知错误.我们可以尝试对项目做"软件–全部重建"操作.如下 ...

  9. 如何友好的处理 WebApi 中抛出的错误

    微软的 ASP.NET Web API 是一个轻量级的web框架,可用来构建基于 http 无状态的rest服务,异常是一种运行时错误,异常处理是一种处理运行时错误的技术,每一个开发者都应该知道如何处 ...

最新文章

  1. 秒杀应用的MySQL数据库优化
  2. python将数字转变为中文读法-Python转换数字到中文大写格式
  3. mysql学习整理(一)
  4. 【BZOJ3252】攻略【闵可夫斯基和】【堆启发式合并】
  5. php做一个计算日期之间天数,PHP计算任意两个日期之间的天数
  6. 从源代码编译安装 Mono 2.4 和 MonoDevelop 2.0
  7. tensorflow错误记录:tf.concat
  8. 多线程的那点儿事(之自旋锁)
  9. mysql error 28,MySQL错误:Got error 28 from storage engine
  10. Python 日期时间处理
  11. how to set up github blog
  12. win10豆沙绿设置
  13. 房价与房租出现大幅“背离”?
  14. 芯片供应商:芯片一级供应商分类和安全芯片库存
  15. 国外的码农是什么状态?硅谷程序员:不加班,不穿女装
  16. 51单片机蜂鸣器操作
  17. linux c写的一个航班查询的程序
  18. 计算机操作系统唤醒原语,计算机操作系统原语分析(范文).doc
  19. 李开复台大演讲:人工智能来了,别怕
  20. html生成海报图片

热门文章

  1. 走进美国最传奇数据中心:顽抗飓风 曾承载97%的电话
  2. 计算机专业有纹身,“韩商言”身上也有纹身?得知背后的原因,无数粉丝暴风哭泣!...
  3. 《从零开始的 RPG 游戏制作教程》第九期:信息反馈(上)
  4. 2019 编程语言排行榜:Java、Python 龙争虎斗!PHP 屹立不倒!
  5. 感悟人生——佛家经典禅语
  6. Windows bat脚本学习二(命令窗口指令)
  7. ecshop 属性自动组合_传奇手游,神途自动升级,好混属性强大
  8. 【推荐】送给优柔寡断和胡思乱想的朋友们17条人生哲理
  9. poj1149迈克卖猪问题(PIGS)
  10. 2019年CSP-J2第一题:数字游戏(number)题解