关于python:一文就能全部搞定Python技能提升异常传播轨迹

7次阅读

共计 2794 个字符,预计需要花费 7 分钟才能阅读完成。

当程序呈现谬误时,零碎会主动引发异样,除此之外,Python 也容许程序自行引发异样,自行引发异样应用 raise 语句实现。

应用 raise 引发异样

如果在程序中须要自行引发异样,则应该应用 raise 语句,raise 语句有如下三种罕用的用法:

1. raise:独自一个 raise

该语句引发当初上下文中捕捉到的异样(如在 except 块中),或默认引发 RuntimeError 异样

2. raise 异样类:raise 后带一个异样类

该语句引发指定异样类的默认实例

3. raise 异样对象:引发指定的异样对象

即便是用户自行引发的异样,也能够通过 try…except 进行捕捉,当然也能够不论它,让该异样向上(先调用者)流传,如果该异样传到 Python 解释器,则程序就会停止。

如下示例示范了解决用户引发异样的两种形式:

由下面程序能够晓得,程序即可在调用 mtd(3)时应用 try…except 来捕捉异样,这样改异样将会被 except 块捕捉,不会流传给调用它的函数;也可间接调用 mtd(3),这样该函数的异样就会间接流传给它的调用函数,如果该函数也不解决该异样,就会导致程序停止。

运行下面程序,输入后果如下:

下面第一行输入的是第一次调用 mtd(3)的后果,该办法引发的异样被 except 块捕捉并解决。

前面的大段输入是第二次调用 mtd(3)的后果,因为该异样没有被 except 块捕捉,因而该异样始终向上流传,直到传给 Python 解释器导致程序停止。

留神:第二次调用 mtd(3)引发的以“File”结尾的三行输入,其实事实的就是异样的流传轨迹信息,即如果程序不对异样进行解决,Python 默认会在控制台输入异样的流传轨迹信息。

** 举荐:020 继续更新,精品小圈子每日都有新内容,干货浓度极高。
牢固人脉、探讨技术 你想要的这里都有!
领先入群,跑赢同龄人!(入群无需任何费用)
点击此处,与 Python 开发大牛一起交流学习。
群号:745895701
申请即送:
Python 软件安装包,Python 实战教程
材料收费支付,包含 Python 根底学习、进阶学习、爬虫、人工智能、自动化运维、自动化测试等 **

自定义异样类

用户自定义异样都应该继承 Exception 基类或 Exception 的子类,在自定义异样类时根本不须要写更多的代码,只须要指定自定义异样类的父类即可。

如下所示:

class AuctionException(Exception):

pass

下面程序创立了 AuctionException 异样类,该异样类不须要类体定义,因而应用 pass 语句作为占位符即可。

except 和 raise 同时应用

在理论利用中对异样可能须要更简单的解决形式——当一个异样呈现时,单靠某个办法无奈实现解决该异样,必须由几个办法合作才可齐全解决该异样。即在异样呈现的以后办法中,程序只对异样进行局部解决,还有些解决须要在该办法的调用者中能力实现,所以应该再次引发异样,让该办法的调用者也能捕捉异样。

为了实现这种通过多个办法合作解决同一个异样的情景,可在 except 块中联合 raise 语句实现,如下:

下面程序中 AuctionTest 类中 except 块捕捉到异样后,零碎打印了该异样的字符串信息,接着引发一个 AuctionException 异样,告诉该办法的调用者再次解决该 AuctionException 异样。所以程序中的 main()函数,也就是 bid()办法的调用者还可再次捕捉 AuctionException 异样,并将该异样的详细描述信息打印进去。

Python 的异样流传轨迹

异样对象提供了一个 with_traceback 用于解决异样的流传轨迹,查看异样的流传轨迹可追踪异样触发的源头,也可看到异样一路触发的轨迹。

如下示例:

下面程序中 main()函数调用 firstMethod(),firstMethod()调用 secondMethod(),secondMethod()调用 thirdMethod(),thirdMethod()间接引发一个 SelfException 异样。

运行下面程序,将会看到如下后果:

能够看出,异样从 thirdMethod()函数开始触发,传到 secondMethod()函数,再传到 firstMethdo()函数,最初传到 main()函数,在 main()函数停止,这个过程就是 Python 的异样流传轨迹。

在理论应用程序的开发中,大多数可重用操作都会被分解成一系列函数或办法调用,这是因为为了具备更好的可重用性,会将每个可重用的代码单元定义成函数或办法,将简单工作逐步合成为更容易治理的小型子工作。因为一个大的业务性能须要由多个函数或办法独特实现,在最终编程模型中,很多对象将通过一系列函数或办法调用来实现通信,执行工作。

所以,当利用程序运行时,常常会产生一系列函数或办法调用,从而造成“函数调用栈”,异样的流传则相同:只有异样没有被齐全捕捉(包含异样没有被捕捉,或异样被解决后从新引发了新异样),异样就从产生异样的函数或办法逐步向外流传,首先传给该函数或办法的调用者,该函数或办法的调用者再传给其调用者 …… 直至最初传到 Python 解释器,此时 Python 解释器会停止该程序,并打印异样的流传轨迹信息。

Python 专门提供了 traceback 模块来解决异样流传轨迹,应用 traceback 可不便地解决 Python 的异样流传轨迹。

导入 traceback 模块之后,traceback 提供了如下两个罕用办法:

1. traceback.print_exc():将异样流传轨迹信息输入到控制台或指定文件中

2. format_exc():将异样流传轨迹信息转换成字符串

到这里可能你有疑难:从下面办法看不出它们到底解决哪个异样的流传轨迹信息?

OK,实际上罕用的 print_exc()是 print_exc([limit[,file]])省略了 limit、file 两个参数的模式。

其中,limit 用于限度显示异样流传的层数,比方函数 A 调用函数 B,函数 B 产生了异样,如果指定 limit=1,则只显示函数 A 外面产生的异样,如果不设置 limit 参数,则默认全副显示。

file 指定将异样流传轨迹信息输入到指定文件中,如果不指定该参数,则默认输入到控制台。

示例如下:

下面程序中第一行先导入 traceback 模块,接下来程序应用 except 捕捉程序的异样,并应用 traceback 的 print_exc()办法输入异样流传信息,别离将它输入到控制台和指定文件中。

运行下面程序,同样可看到在控制台输入异样流传信息,且在程序目录下生成了一个 log.txt 文件,该文件中同样记录了异样流传信息。

最初说一下异样解决的规定:

一般来说,胜利的异样解决应该当时如下 4 个指标:

1. 使程序代码凌乱最小化

2. 捕捉并保留诊断信息

3. 告诉适合的人员

4. 采纳适合的形式完结异样流动

正文完
 0