0
点赞
收藏
分享

微信扫一扫

python程序调试和异常处理

毅会 2022-05-01 阅读 47
python

程序异常

        有时程序错误称为程序异常,相信每一位写程序的人一定会碰上程序错误,过去碰上这类情况将终止执行,同时出现错误信息,错误信息内容通常显示Traceback,然后列出异常报告。Python提供的功能可以让我们捕捉异常和撰写异常处理程序,当发生异常时被我们捕捉到则会去执行异常处理程序,然后程序可以继续执行。

设计一个程序异常

以一个除数为0的错误开始说明。

        上述程序在执行第3行时,一切还是正常。但是执行第4行,因为第2个参数是0,导致ZeroDivisionError: division by zero的错误,所以整个程序执行终止。其实对于上述程序而言,若是程序可以执行第5行,是可以正常得到执行结果的,可是程序第4行已经造成程序终止了,所以无法执行第5行。

撰写异常处理程序

try - except

        发生异常被捕捉时程序会执行异常处理程序,然后跳开异常位置,再继续往下执行。这时要使用try - except指令,它的语法格式如下:

上述会执行try:下面的指令,如果正常则跳离except部分,如果指令异常,则检查此异常是否是异常对象所指的错误;如果是,代表异常被捕捉了,则执行此异常对象下面的异常处理程序。

重新设计实例1,增加异常处理程序

        上述程序执行第6行时,会将参数(10,2)带入division()函数,由于执行try的指令的 “x/y” 没有问题,所以可以执行 “return x / y”,这是Python将跳过except的指令。当程序执行第7行时,会将参数(5,0)带入division()函数,由于执行try的指令的 “x / y” 产生了除数为0的ZeroDivisionError异常,这时Python会寻找是否有处理这类异常的except ZeroDivisionError存在,如果有就表示此异常被捕捉,就去执行相关的错误处理程序,此例是执行第5行,输出“除数不可为0”的错误。函数返回然后输出结果None,None是一个对象,表示结果不存在,最后返回程序第8行,继续执行相关指令。

        从上述案例可以看到,程序增加了try - except后,若是异常问题被except捕捉,则出现的异常信息比较好处理,同时不会有程序中断的情况发生。

        特别需要留意的是在try - except的使用中,如果在try:后面的指令产生异常,则这个异常不是我们设计的except异常对象,表示异常没被捕捉到,这时程序依旧会像实例1一样,直接出现错误信息,然后程序终止。

重新设计实例2,但在程序第9行使用字符呼叫除法运算,造成程序异常。

        由上述执行结果可以看到异常原因是TypeError,由于我们在程序中没有设计except TypeError的异常处理程序,所以程序会终止执行。要解决这类问题需要多设计一组try - except。

        扩充设计实例3,增加TypeError异常的捕捉

try - except - else

        Python在try - except中又增加了else指令,这个指令存放的主要目的是try内的指令正确时,可以执行else内的指令区块,我们可以将这部分指令区块称为正确处理程序,这样可以增加程序的可读性。语法格式如下:

使用try - except - else重新设计实例3

执行结果:与实例2相同

找不到文档的错误FileNotFoundError

程序设计时经常发生的异常是打开文档时找不到文档,这是会有FileNotFoundError异常。

常见的异常对象

AttributeError通常是指对象没有这个属性
Exception一般错误皆可用
FileNotFoundError找不到open()打开的文档
IOError在输入或输出时发生错误
IndexError索引超出范围区间
KeyError在映射中没有这个键
MemoryError需求内存空间超出范围
NameError对象名称未声明
SyntaxError语法错误
SystemError直译器的系统错误
TypeError数据类型错误
ValueError输入无效参数
ZeroDivisionError除数为零

finally

        Python的关键词finally的功能是和try配合使用,在try之后可以有except或else,这个finally关键词必须放在except和else之后,不论是否有异常发生,一定会执行这个finally内的程序代码。

这个功能主要是用在Python程序与数据库连接时,输出连接相关信息。

try - except - finally的应用,读者可以发现无论是否有异常,都会执行finally

        上述程序执行时,如果没有发生异常,则程序会先输出字符串“阶段任务完成”然后返回主程序,输出division()的返回值。如果程序有异常则会先输出字符串“异常发生”,再执行finally的程序代码输出字符串“阶段任务完成”,然后返回主程序输出“None”。

举报

相关推荐

0 条评论