异常是python中进行调试判断的功能,能够帮助我们更好的进行代码编译。本篇笔记为错误和异常处理
一.异常的相关概念
Python运行中经常会出现Bug。而Bug大致属于以下三类:
- 语法错误(SyntaxError):拼写、符号等错误;
- 运行错误(ZeroDivisionError):未导入相关模块,打开不存在的文件,除零等情况;
- 逻辑错误:各处看似合理,但存在逻辑漏洞,无法达成结束的概念,如死循环。
这些Bug被Python称为异常,一般是再程序运行时引发的错误。
正常的异常处理流程:
当程序出现异常时,会先生成一个异常对象,再提交给解释器(抛出异常);
python解释器接受异常后,寻找有问题的代码进行处理(捕获异常);
无解决方法则系统终止。
对于异常的理解:
异常类:所有的异常都是基类Exception的成员,都定义在exceptions模块中。
当异常无法得到解决时会进行回溯,返回有问题的代码并输出错误原因。
Python异常类的层次结构:
常见的异常类:
抛出异常:
当我们进行异常调试时,不仅需要考解释器的自动异常抛出,还要选择自己主动抛出异常。
语句:
raise 异常名[(异常描述)]
eg:if a<0: raise ValueError ("数值不能为负数")
也可以选择利用异常类:
raise IndexError
此时系统会自动创建一个异常的实例对象。并进行主动抛出。
也可以直接使用异常类的对象:
index = IndexError()
注:通常在抛出异常时,可以在异常后增加对异常的描述以便于解决。
二.异常的处理
异常的处理类似于if elif else的形式,分批进行处理。即:
try:
抛出异常
except 异常名称:
捕获异常(及解决办法)
finally:
结果
异常处理的使用方法:
注:多个excrpt语句有时会很麻烦,可以在一个except后用( )一次性包括好几个异常一起判断。(即构成一个元组)。
如果想要描述捕捉到异常时解释器的描述信息,可以使用以下语句:
except (ZeroDivisionError, ValueError) as result:print(f" 捕捉到异常 :{result}")
但是,由于异常的种类繁多,我们不可能将所有的异常都打一遍进行判断。因此,我们可以省略对异常的描述,直接用except : 进行表达。(也可以用except Exception as result: 囊括所有异常)。
当没有捕获到异常时,就会自动执行else中的语句。
而如果无论是否出现异常,都要进行一些操作,就可以使用finally进行资源释放。
整体结构梳理:
自定义异常:
异常普遍是由系统定义的,对于我们自己编译程序时想要进行的异常审查可能不充足,因此,我们也可以尝试自定义一个异常。
步骤:
1. 创建一个继承Exception类的子类,就是自定义异常类。
2. 当遇到自己设定的错误时,使用 raise 语句抛出自定义的异常 。eg:
三.断言处理
断言是指在代码运行过程中对一些关键值等条件的判断问题。其大致包括:代码执行前(后)必须具备的特性或不能变化的特性。
语法:
assert 布尔表达式,<描述性字符串>
(等同于:
if not 布尔表达式:
raise AssertionError(<描述性字符串>)
)
四.程序的基本调试方法
在程序运行前寻查Bug的过程就是调试。
对于语法、运行的错误,python解释器可以直接输出异常原因。但对于逻辑错误,一般采用断点跟踪等方法。
单条语句调试:
设置断点,运行查看是否正常运行。
函数调试:
1. 开始debug,不断地按Ctrl+F10 单行执行这个程序
异常一般只用在程序正常运行前的调试里,在正式的代码中一般不用,所以只要知道如何进行调试即可。
END.