在Python语言中,只有在程序运行后才会执行语法检查。所以,只有在运行或测试程序时,才会真正知道该程序能不能正常运行。
在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为“异常”。
Python中常见的异常
9.2 异常处理语句
在程序开发时,有些错误并不是每次运行都会出现。
9.2.1 try…except语句
在Python中,提供了try…except语句捕获并处理异常。在使用时,把可能产生异常的代码放在try语句块中,把处理结果放在except语句块中,这样,当try语句块中的代码出现错误时,就会执行except语句块中的代码,如果try语句块中的代码没有错误,那么except语句块将不会执行。具体的语法格式如下:
try:
block1except [ExceptionName [as alias]]: block2
参数说明:
■ block1:表示可能出现错误的代码块。
■ ExceptionName [as alias]:可选参数,用于指定要捕获的异常。其中,ExceptionName表示要捕获的异常名称,如果在其右侧加上as alias,则表示为当前的异常指定一个别名,通过该别名,可以记录异常的具体内容。说明:在使用try…except语句捕获异常时,如果在except后面不指定异常名称,则表示捕获全部异常。
■ block2:表示进行异常处理的代码块。在这里可以输出固定的提示信息,也可以通过别名输出异常的具体内容。说明:使用try…except语句捕获异常后,当程序出错时,输出错误信息后,程序会继续执行。
多学两招:在捕获异常时,如果需要同时处理多个异常也可以采用下面的代码实现:
try: # 捕获异常
division() # 调用函数
except (ValueError,ZeroDivisionError ) as e: # 处理异常
print("出错了,原因是:",e) # 显示出错原因
即在except语句后面使用一对小括号将可能出现的异常名称括起来,多个异常名称之间使用逗号分隔。如果想要显示具体的出错原因,那么再加上as指定一个别名。
9.2.2 try…except…else语句
在Python中,还有另一种异常处理结构,它是try…except…else语句,也就是在原来try…except语句的基础上再添加一个else子句,用于指定当try语句块中没有发
现异常时要执行的语句块。该语句块中的内容当try语句中发现异常时,将不被执行。
9.2.3 try…except…finally语句
完整的异常处理语句应该包含finally代码块,通常情况下,无论程序中有无异常产生,finally代码块中的代码都会被执行,其语法格式如下:
try:
block1except [ExceptionName [as alias]]:
block2
finally: block3
对于try…except…finally语句的理解并不复杂,它只是比try…except语句多了一个finally语句,如果程序中有一些在任何情形中都必须执行的代码,那么就可以将它
们放在finally代码块中。说明:使用except子句是为了允许处理异常。无论是否引发了异常,使用finally子句都可以执行清理代码。如果分配了有限的资源(如打开
文件),则应将释放这些资源的代码放置在finally代码块中。
异常处理语句的不同子句的执行关系
9.2.4 使用raise语句抛出异常
如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用raise语句在函数或方法中抛出异常。raise语句的语法格式如下:
raise [ExceptionName[(reason)]]
其中,ExceptionName[(reason)]为可选参数,用于指定抛出的异常名称以及异常信息的相关描述。如果省略,就会把当前的错误原样抛出。
说明:ExceptionName(reason)参数中的“(reason)”也可以省略,如果省略,则在抛出异常时,不附带任何描述信息。
说明:在应用raise抛出异常时,要尽量选择合理的异常对象,而不应该抛出一个与实际内容不相关的异常。
9.3 程序调试
在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的。对于语法方面的比较好检测,因为程序会直接停止,并且给出错误提示。而对于逻
辑错误就不太容易发现了,因为程序可能会一直执行下去,但结果是错误的。
9.3.1 使用自带的IDLE进行程序调试
多数的集成开发工具都提供了程序调试功能。例如,我们一直在使用的IDLE,也提供了程序调试功能。使用IDLE进行程序调试的基本步骤如下:
(1)打开IDLE(Python Shell),在主菜单上选择“Debug”→“Debugger”菜单项,将打开Debug Control对话框(此时该对话框是空白的),同时Python Shell窗
口中将显示“[DEBUG ON]”(表示已经处于调试状态)。
(2)在Python Shell窗口中,选择“File”→“Open”菜单项,打开要调试的文件。这里打开本章的实例01中编写的division_apple.py文件,然后添加需要的断点。
说明:断点的作用:设置断点后,程序执行到断点时就会暂时中断执行,程序可以随时继续。
添加断点的方法是:在想要添加断点的行上,单击鼠标右键,在弹出的快捷菜单中选择“Set Breakpoint”菜单项。添加断点的行将以黄色底纹标记,
说明:如果想要删除已经添加的断点,可以选中已经添加断点的行,然后单击鼠标右键,在弹出的快捷菜单中选择“Clear Breakpoint”菜单项。
(3)添加所需的断点(添加断点的原则是:程序执行到这个位置时,想要查看某些变量的值,就在这个位置添加一个断点)后,按下快捷键F5,执行程序,这时
Debug Control对话框中将显示程序的执行信息,选中Globals复选框,将显示全局变量,默认只显示局部变量。
(4)在图9.13所示的调试工具栏中,提供了5个工具按钮。这里单击Go按钮继续执行程序,直到所设置的第一个断点。由于在division_apple.py文件中,第一个断
点之前需要获取用户的输入,所以需要先在Python Shell窗口中输入苹果和小朋友的数量。输入后Debug Control窗口中的数据将发生变化。
说明:在调试工具栏中的5个按钮的作用为:Go按钮用于执行跳至断点操作;Step按钮用于进入要执行的函数;Over按钮表示单步执行;Out按钮表示跳出所在的
函数;Quit按钮表示结束调试。
(5)继续单击Go按钮,将执行到下一个断点,查看变量的变化,直到全部断点都执行完毕。
程序调试完毕后,可以关闭Debug Control窗口,此时在Python Shell窗口中将显示“[DEBUG OFF]”(表示已经结束调试)。
9.3.2 使用assert语句调试程序
在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的。对于语法方面的比较好检测,因为程序会直接停止,并且给出错误提示。而对于逻
辑错误就不太容易发现了,因为程序可能会一直执行下去,但结果是错误的。
Python提供了assert语句来调试程序。assert的中文意思是断言,它一般用于对程序某个时刻必须满足的条件进行验证。
assert语句的基本语法如下:assert expression [,reason]
参数说明:■ expression:条件表达式,如果该表达式的值为真时,什么都不做,如果为假时,则抛出AssertionError异常。
■ reason:可选参数,用于对判断条件进行描述,为了以后更好地知道哪里出现了问题。
通常情况下,assert语句可以和异常处理语句结合使用。
小结
本章主要对异常处理语句和常用的程序调试方法进行了详细讲解。在讲解过程中,重点讲解了如何使用异常处理语句捕获和抛出异常,以及如何使用自带的IDLE工具和断言语句进行调试。