python3 使用traceback定位异常

1、我们使用正常的输出语句
得到的是(输出结果:division by zero)虽然得到了错误的日志输出,但是不知道为什么出错。
在这里插入图片描述
得到的是(输出结果:division by zero)虽然得到了错误的日志输出,但是不知道为什么出错,也不能定位具体出错位置。

2、现在我们使用 traceback
但是当我们使用traceback的时候,就可以得到具体的错误,以及定位到出错的位置,如下图。
在这里插入图片描述
就可以得到具体的错误,以及定位到出错的位置。这样就能更方便调试错误。

参考文献
traceback文档地址:
https://docs.python.org/2/library/traceback.html
以下为google翻译(仅供参考,):
该模块提供了一个标准接口,用于提取,格式化和打印Python程序的堆栈跟踪。它在打印堆栈跟踪时完全模仿了Python解释器的行为。当您想要在程序控制下打印堆栈跟踪时,这非常有用,例如在解释器周围的“包装器”中。

该模块使用回溯对象 - 这是存储在变量中的对象类型sys.exc_traceback(不建议使用), sys.last_traceback并作为第三项返回 sys.exc_info()。

该模块定义了以下功能:

traceback.print_tb(tb [,limit [,file ] ] )
打印以限制回溯对象tb中的堆栈跟踪条目。如果 省略limit或者None打印所有条目。如果省略文件或None输出转到sys.stderr; 否则它应该是一个打开的文件或类似文件的对象来接收输出。

traceback.print_exception(etype,value,tb [,limit [,file ] ] )
打印异常信息,最多限制堆栈跟踪条目从traceback tb到文件。这与print_tb()以下方式不同:(1)如果tb不是None,则打印标题; (2)在堆栈跟踪后打印异常etype和值 ; (3)如果etype是且值具有适当的格式,则打印出发生语法错误的行,其中插入符号表示错误的大致位置。Traceback (most recent call last):SyntaxError

traceback.print_exc([ limit [,file ] ] )
这是一个简写。(实际上,它用于以线程安全的方式检索相同的信息,而不是使用已弃用的变量。)print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file)sys.exc_info()

traceback.format_exc([ 限制] )
这就像print_exc(limit)但返回一个字符串而不是打印到文件。

版本2.4中的新功能。

traceback.print_last([ limit [,file ] ] )
这是一个简写。通常,只有在异常达到交互式提示后才会起作用(请参阅参考资料)。print_exception(sys.last_type, sys.last_value, sys.last_traceback, limit, file)sys.last_type

traceback.print_stack([ f [,limit [,file ] ] ] )
此函数从其调用点打印堆栈跟踪。可选的 f参数可用于指定要启动的备用堆栈帧。可选的limit和file参数具有相同的含义 print_exception()。

traceback.extract_tb(tb [,限制] )
返回从追溯对象tb中提取的最多限制 “预处理”堆栈跟踪条目的列表。它对堆栈跟踪的替代格式化很有用。如果省略limit,则提取所有条目。“预处理”堆栈跟踪条目是4元组(文件名,行号,函数名*,文本),表示通常为堆栈跟踪打印的信息。该文本是开头和结尾的空白剥离的字符串; 如果源不可用则是。NoneNone

traceback.extract_stack([ f [,limit ] ] )
从当前堆栈帧中提取原始回溯。返回值的格式与extract_tb()。可选的f和limit 参数具有与之相同的含义print_stack()。

traceback.format_list(extracted_list )
给定由extract_tb()or extract_stack()返回的元组列表,返回准备打印的字符串列表。结果列表中的每个字符串对应于参数列表中具有相同索引的项。每个字符串以换行符结尾; 对于那些源文本行不是的项目,字符串也可以包含内部换行符 None。

traceback.format_exception_only(etype,value )
格式化回溯的异常部分。参数是异常类型,etype和值,例如由sys.last_type和 给出的sys.last_value。返回值是一个字符串列表,每个字符串以换行符结尾。通常,列表包含单个字符串; 但是,对于 SyntaxError异常,它包含多行(打印时)显示有关语法错误发生位置的详细信息。指示发生了哪个异常的消息是列表中的始终最后一个字符串。

traceback.format_exception(etype,value,tb [,limit ] )
格式化堆栈跟踪和异常信息。参数与相应的参数具有相同的含义print_exception()。返回值是一个字符串列表,每个字符串以换行符结尾,一些包含内部换行符。连接和打印这些行时,将打印完全相同的文本print_exception()。

traceback.format_tb(tb [,限制] )
简写。format_list(extract_tb(tb, limit))

traceback.format_stack([ f [,limit ] ] )
简写。format_list(extract_stack(f, limit))

traceback.tb_lineno(tb )
此函数返回traceback对象中设置的当前行号。这个函数是必要的,因为在2.3之前的Python版本中,当-O标志传递给Python时,tb.tb_lineno没有正确更新。此功能在2.3版本中没有用处。

回溯示例

这个简单的例子实现了一个基本的read-eval-print循环,类似于标准Python交互式解释器循环(但不太有用)。有关解释器循环的更完整实现,请参阅该code 模块。

import sys, traceback

def run_user_code(envdir):
    source = raw_input(">>> ")
    try:
        exec source in envdir
    except:
        print "Exception in user code:"
        print '-'*60
        traceback.print_exc(file=sys.stdout)
        print '-'*60

envdir = {}
while 1:
    run_user_code(envdir)

以下示例演示了打印和格式化异常和回溯的不同方法:

import sys, traceback

def lumberjack():
    bright_side_of_death()

def bright_side_of_death():
    return tuple()[0]

try:
    lumberjack()
except IndexError:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print "*** print_tb:"
    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
    print "*** print_exception:"
    traceback.print_exception(exc_type, exc_value, exc_traceback,
                              limit=2, file=sys.stdout)
    print "*** print_exc:"
    traceback.print_exc()
    print "*** format_exc, first and last line:"
    formatted_lines = traceback.format_exc().splitlines()
    print formatted_lines[0]
    print formatted_lines[-1]
    print "*** format_exception:"
    print repr(traceback.format_exception(exc_type, exc_value,
                                          exc_traceback))
    print "*** extract_tb:"
    print repr(traceback.extract_tb(exc_traceback))
    print "*** format_tb:"
    print repr(traceback.format_tb(exc_traceback))
    print "*** tb_lineno:", exc_traceback.tb_lineno

该示例的输出看起来类似于:

*** print_tb:
  File "<doctest...>", line 10, in <module>
    lumberjack()
*** print_exception:
Traceback (most recent call last):
  File "<doctest...>", line 10, in <module>
    lumberjack()
  File "<doctest...>", line 4, in lumberjack
    bright_side_of_death()
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
  File "<doctest...>", line 10, in <module>
    lumberjack()
  File "<doctest...>", line 4, in lumberjack
    bright_side_of_death()
IndexError: tuple index out of range
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n',
 '  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',
 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n',
 'IndexError: tuple index out of range\n']
*** extract_tb:
[('<doctest...>', 10, '<module>', 'lumberjack()'),
 ('<doctest...>', 4, 'lumberjack', 'bright_side_of_death()'),
 ('<doctest...>', 7, 'bright_side_of_death', 'return tuple()[0]')]
*** format_tb:
['  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',
 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n']
*** tb_lineno: 10

以下示例显示了打印和格式化堆栈的不同方法:

import traceback
def another_function():
    lumberstack()

def lumberstack():
		traceback.print_stack()
	    print repr(traceback.extract_stack())
     	print repr(traceback.format_stack())

another_function()
  File "<doctest>", line 10, in <module>
    another_function()
  File "<doctest>", line 3, in another_function
    lumberstack()
  File "<doctest>", line 6, in lumberstack
    traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
 ('<doctest>', 3, 'another_function', 'lumberstack()'),
 ('<doctest>', 7, 'lumberstack', 'print repr(traceback.extract_stack())')]
['  File "<doctest>", line 10, in <module>\n    another_function()\n',
 '  File "<doctest>", line 3, in another_function\n    lumberstack()\n',
 '  File "<doctest>", line 8, in lumberstack\n    print repr(traceback.format_stack())\n']

最后一个示例演示了最后几个格式化函数:

import traceback
traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
                       	('eggs.py', 42, 'eggs', 'return "bacon"')])
['  File "spam.py", line 3, in <module>\n    spam.eggs()\n',
 '  File "eggs.py", line 42, in eggs\n    return "bacon"\n']
an_error = IndexError('tuple index out of range')
traceback.format_exception_only(type(an_error), an_error)
['IndexError: tuple index out of range\n']
  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Traceback错误是指在Python程序发生了异常,导致程序无法正常执行,Python会自动输出错误信息,包括错误类型、错误位置和错误信息等,这些信息就是Traceback错误。通常我们可以通过查看Traceback错误信息来定位和解决程序的问题。 ### 回答2: 在Pythontraceback错误是指当程序发生异常时,Python解释器会自动生成一个traceback对象来描述异常的详细信息。traceback错误通常包含了异常的类型、发生异常的代码行数以及异常发生时的调用堆栈信息等。 当程序发生异常时,Python解释器会打断程序的正常执行流程,并根据异常的类型、位置等信息创建一个traceback对象。这个对象会在控制台打印异常信息,并显示出异常发生时的调用堆栈,以便开发者定位问题所在。 traceback错误通常包含以下几个要点: 1. 异常类型:描述了程序出现异常的具体类型,例如ZeroDivisionError(除以零错误)、TypeError(类型错误)等。 2. 异常消息:包含了详细的错误信息,以便开发者了解具体的错误原因。 3. 文件名和行号:指示了出现异常的代码行数以及所在的源代码文件名,方便开发者定位问题。 4. 调用堆栈:展示了异常发生时的函数调用堆栈信息,从异常触发的原始函数一直到程序的最外层函数。 通过查看traceback错误信息,开发者可以追溯异常的具体发生位置,并对代码进行调试和修复。在定位问题和解决bug时,traceback错误是一个非常有用的工具。 总结起来,Pythontraceback错误是指当程序发生异常时,Python解释器会自动生成一个traceback对象,其包含了异常的类型、详细信息以及异常发生的位置和调用堆栈信息。通过查看traceback错误,开发人员可以方便地定位问题并进行错误处理。 ### 回答3: 在PythonTraceback错误是指当程序运行时发生异常时所抛出的错误信息。Traceback错误包含了异常发生的位置、代码对应的文件名、行数,以及函数调用的堆栈信息,它能够帮助我们追踪和定位错误的来源。 当Python程序发生异常时,解释器会通过Traceback打印出异常信息。Traceback信息的格式为调用栈的逆序,最后一行是引发异常的代码位置,而之前的行是异常的上层调用栈。每一行的信息分为三部分:文件路径、行号和函数名。 Traceback错误常见的类型主要有SyntaxError、TypeError、NameError、ValueError等。其SyntaxError表示语法错误,TypeError表示类型错误,NameError表示名称错误,ValueError表示值错误等。根据错误的类型,我们能够大致判断错误所在的位置和原因。 我们可以利用Traceback错误来快速定位和解决代码的bug。通过阅读Traceback信息,我们能够分析异常发生的原因,找出代码错误,并对其进行修复。此外,在开发过程,我们可以使用try-except语句来捕获和处理异常,使得程序能够更好地处理错误情况,而不会停止运行。 总而言之,在PythonTraceback错误是指在程序运行过程发生的异常,它提供了异常的详细信息,可以帮助我们定位和修复代码错误。通过分析Traceback信息,我们能够准确地了解异常的原因,并采取相应的措施来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值