python3 使用traceback定位异常实例
1、我们使用正常的输出语句
得到的是(输出结果:divisionbyzero)虽然得到了错误的日志输出,但是不知道为什么出错,也不能定位具体出错位置。
2、现在我们使用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]])
打印异常信息,最多限制堆栈跟踪条目从tracebacktb到文件。这与print_tb()以下方式不同:(1)如果tb不是None,则打印标题;(2)在堆栈跟踪后打印异常etype和值;(3)如果etype是且值具有适当的格式,则打印出发生语法错误的行,其中插入符号表示错误的大致位置。Traceback(mostrecentcalllast):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()orextract_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模块。
importsys,traceback defrun_user_code(envdir): source=raw_input(">>>") try: execsourceinenvdir except: print"Exceptioninusercode:" print'-'*60 traceback.print_exc(file=sys.stdout) print'-'*60 envdir={} while1: run_user_code(envdir)
以下示例演示了打印和格式化异常和回溯的不同方法:
importsys,traceback deflumberjack(): bright_side_of_death() defbright_side_of_death(): returntuple()[0] try: lumberjack() exceptIndexError: 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,firstandlastline:" formatted_lines=traceback.format_exc().splitlines() printformatted_lines[0] printformatted_lines[-1] print"***format_exception:" printrepr(traceback.format_exception(exc_type,exc_value, exc_traceback)) print"***extract_tb:" printrepr(traceback.extract_tb(exc_traceback)) print"***format_tb:" printrepr(traceback.format_tb(exc_traceback)) print"***tb_lineno:",exc_traceback.tb_lineno
该示例的输出看起来类似于:
***print_tb: File"",line10,in lumberjack() ***print_exception: Traceback(mostrecentcalllast): File" ",line10,in lumberjack() File" ",line4,inlumberjack bright_side_of_death() IndexError:tupleindexoutofrange ***print_exc: Traceback(mostrecentcalllast): File" ",line10,in lumberjack() File" ",line4,inlumberjack bright_side_of_death() IndexError:tupleindexoutofrange ***format_exc,firstandlastline: Traceback(mostrecentcalllast): IndexError:tupleindexoutofrange ***format_exception: ['Traceback(mostrecentcalllast):\n', 'File" ",line10,in \nlumberjack()\n', 'File" ",line4,inlumberjack\nbright_side_of_death()\n', 'File" ",line7,inbright_side_of_death\nreturntuple()[0]\n', 'IndexError:tupleindexoutofrange\n'] ***extract_tb: [(' ',10,' ','lumberjack()'), (' ',4,'lumberjack','bright_side_of_death()'), (' ',7,'bright_side_of_death','returntuple()[0]')] ***format_tb: ['File" ",line10,in \nlumberjack()\n', 'File" ",line4,inlumberjack\nbright_side_of_death()\n', 'File" ",line7,inbright_side_of_death\nreturntuple()[0]\n'] ***tb_lineno:10
以下示例显示了打印和格式化堆栈的不同方法:
importtraceback defanother_function(): lumberstack() deflumberstack(): traceback.print_stack() printrepr(traceback.extract_stack()) printrepr(traceback.format_stack()) another_function() File"",line10,in another_function() File" ",line3,inanother_function lumberstack() File" ",line6,inlumberstack traceback.print_stack() [(' ',10,' ','another_function()'), (' ',3,'another_function','lumberstack()'), (' ',7,'lumberstack','printrepr(traceback.extract_stack())')] ['File" ",line10,in \nanother_function()\n', 'File" ",line3,inanother_function\nlumberstack()\n', 'File" ",line8,inlumberstack\nprintrepr(traceback.format_stack())\n']
最后一个示例演示了最后几个格式化函数:
importtraceback traceback.format_list([('spam.py',3,'','spam.eggs()'), ('eggs.py',42,'eggs','return"bacon"')]) ['File"spam.py",line3,in \nspam.eggs()\n', 'File"eggs.py",line42,ineggs\nreturn"bacon"\n'] an_error=IndexError('tupleindexoutofrange') traceback.format_exception_only(type(an_error),an_error) ['IndexError:tupleindexoutofrange\n']
以上这篇python3使用traceback定位异常实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。