首页 > 编程语言 >Python代码调试之异常回溯

Python代码调试之异常回溯

时间:2023-06-09 20:01:20浏览次数:29  
标签:info division exc Python sys File 回溯 line 调试


当发生异常时,Python会回溯异常,给出大量的提示,可能会给程序员的定位和纠错带来一定的困难,这时可以使用sys模块的exc_info()函数来回溯最近一次异常。

sys.exc_info( )的返回值tuple是一个三元组(type,  value,  traceback),其中:

  • type —— 异常的类型
  • value —— 异常的信息或者参数
  • traceback —— 包含调用栈信息的对象

例如:

>>> 1/0
Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    1/0
ZeroDivisionError: integer division or modulo by zero
>>> import sys
>>> try:
  1/0
except:
  r = sys.exc_info()
  print(r)
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero',), <traceback object at 0x000000000375C788>)

sys.exc_info()可以直接定位最终引发异常的原因,结果也比较简洁,但是缺点是难以直接确定引发异常的代码位置。假设有如下函数定义:

>>> def A():1/0 
>>> def B():A() 
>>> def C():B()

直接调用函数,抛出异常:

>>> C()
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    C()
  File "<pyshell#34>", line 2, in C
    B()
  File "<pyshell#31>", line 2, in B
    A()
  File "<pyshell#28>", line 2, in A
    1/0
ZeroDivisionError: integer division or modulo by zero

使用sys.exc_info()查看异常信息时并不是非常直观:

>>> try:
         C()
except:
         r = sys.exc_info()
         print(r)
 
(<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or modulo by zero',), <traceback object at 0x0134C990>)

如果需要的话,可以使用traceback模块来查看详细信息:

>>> import traceback
>>> import sys
>>> def A():1/0
>>> def B():A()
>>> def C():B()
>>> try:
    C()
except:
    excType, excValue, excTraceback = sys.exc_info()
    traceback.print_exception(excType, excValue,
                              excTraceback, limit=3)
    print(excValue)
    traceback.print_tb(excTraceback)
Traceback (most recent call last):
  File "<pyshell#44>", line 2, in <module>
  File "<pyshell#42>", line 1, in C
  File "<pyshell#40>", line 1, in B
ZeroDivisionError: division by zero
division by zero
  File "<pyshell#44>", line 2, in <module>
  File "<pyshell#42>", line 1, in C
  File "<pyshell#40>", line 1, in B
  File "<pyshell#38>", line 1, in A

标签:info,division,exc,Python,sys,File,回溯,line,调试
From: https://blog.51cto.com/u_9653244/6450994

相关文章

  • Python+pandas读取Excel文件并统计演员参演电影数量
    Excel样本数据请参考Python读取Excel文件并统计演员参演电影>>>importpandasaspd>>>df=pd.read_excel('电影导演演员.xlsx')>>>df电影名称导演演员0电影1导演1演员1,演员2,演员3,演员41电影2导演2演员3,演员2,演员4,演......
  • python爬虫--爬取各大城市的各个区域的租房信息
    一、选题背景衣食住行是生活的基本需求。衣和食好解决,不喜欢的衣服可以买新的,不好吃的食物可以换一家吃。可是在住宿上,买房和租房的置换成本都相对较高,因此房源选择尤为慎重。作为目前买不起房的自然人,我们一般是通过中介来实现租房的需求比如自如,贝壳找房和链家。链家占据了租赁......
  • 详解Python中的浅复制与深复制
    列表对象的copy()方法返回列表的浅复制。所谓浅复制,是指生产一个新的列表,并且把原列表中所有元素的引用都复制到新列表中。如果原列表中只包含整数、实数、复数等基本类型或元组、字符串这样的不可变类型,一般是没有问题的。但是,如果原列表中包含列表之类的可变数据类型,由于浅复制时......
  • Python实现图像空域随机水印加入与提取
    本文要点在于Python扩展库pillow中Image类的运用。图像空域随机水印的主要思路在于:在原始图像中随机选取一些位置替换为水印图片中的非背景像素,同时生成日志文件记录替换的位置和水印中像素位置的对应关系,然后可以根据加入水印的图片和日志文件来提取和验证水印。fromosimportre......
  • Python泛型函数与单分发器
    这里的泛型函数是指由一组为不同类型参数执行相似操作的函数组成的函数,具体调用哪一个函数的实现取决于分发算法和参数类型。Python单分发器是实现泛型函数的一种形式,由一个单一参数来决定选择和调用哪个函数。下面的代码演示了单分发器泛型函数的有关用法:fromfunctoolsimportsi......
  • 列表元素循环移位中Python切片的妙用
    之前有个文章中介绍了列表循环移位的3中方法其中第二种方法虽然更直接地翻译了题目的要求,但是显得还是有点啰嗦,如果充分利用Python中的切片技术,可以写成下面更简洁的形式:>>>defdemo(lst,k):x=lst[k-1::-1]y=lst[:k-1:-1]returnlist(reversed(x+y))#测试用......
  • Python中的循环结构
    Python主要有for循环和while循环两种形式的循环结构,多个循环可以嵌套使用,并且还经常和选择结构嵌套使用。while循环一般用于循环次数难以提前确定的情况,当然也可以用于循环次数确定的情况;for循环一般用于循环次数可以提前确定的情况,尤其适用于枚举或遍历序列或迭代对象中元素的场合......
  • 使用Python批量随机化文件名
    本文的代码可以把指定文件夹中的所有文件名批量随机化。fromstringimportascii_lettersfromosimportlistdir,renamefromos.pathimportsplitext,joinfromrandomimportchoice,randintdefrandomFilename(directory):forfninlistdir(directory):#......
  • Python enumerate()函数的用法
    1.描述enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。 2.语法enumerate(sequence,[start=0]) 3.参数sequence: 一个序列、迭代器或其他支持迭代对象。start: 下标起始位......
  • Python响应Ctrl键+鼠标滚轮操作动态调整文本框的字号
    编写程序,使用tkinter设计程序界面,其中放置带滚动条的文本框组件ScrolledText,当鼠标悬于该组件上方时,可以通过Ctrl键和鼠标滚轮来动态调整文本框中文本的字号,鼠标滚轮向上滚动时增大字号,向下滚动时减小字号。参考代码:......