Python 异常处理及程序调试

在Python语言中,只有在程序运行后才会执行语法检查。所以,只有在运行或测试程序时,才会真正知道该程序能不能正常运行。

在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为“异常”。

Python中常见的异常

92e8d0fbf54049dfb5a3f76dba84da6f.png

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代码块中。

异常处理语句的不同子句的执行关系

ec4f8090deb349eb8c76ff631c41fd1f.png

 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工具和断言语句进行调试。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小程序员.¥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值