购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 异常处理

异常是指程序运行期间出现错误或意外情况。一般情况下,在Python无法正常处理程序时就会发生一个异常。引发异常有各种各样的原因,例如命名错误、数据类型错误等。Python提供了一套完整的异常处理方法,可以用来对各种可预见的错误进行处理。

2.4.1 Python异常类

在Python中,异常是以对象的形式实现的。BaseException类是所有异常类的基类,而其子类Exception则是除SystemExit、KeyboardInterrupt和GeneratorExit这3个系统级异常之外所有内置异常类和用户自定义异常类的基类。

Python中常见的标准异常详见表2-4。

表2-4 Python中的常见标准异常

2.4.2 try-except语句

在Python中,异常处理可通过try-except语句来实现。这个语句由try子句和except子句两部分组成,可以用来检测try语句块中的错误,从而让except子句捕获异常信息并加以处理。如果不想在异常发生时结束程序运行,只需要在try里捕获它即可。按照异常处理分支的数目,try-except语句可以分为单分支异常处理和多分支异常处理。

1.单分支异常处理

在单分支异常处理中,try-except语句的语法格式如下:

其中语句块包含可能会引发异常的语句,异常处理语句块用于对异常进行处理。语句块和异常处理语句块都可以是单个语句或多个语句,使用单个语句时,可以与try或except位于同一行;使用多个语句时,这些语句必须具有相同的缩进量。

单分支异常处理语句未指定异常类型,对所有异常不加区分进行统一处理,其执行流程如下:执行try后面的语句块,如果未发生异常,则执行语句块后直接执行try-except语句的后续语句;如果引发异常,则转向异常处理语句块,然后执行try-except语句的后续语句。

【例2.17 】 整数除法中的单分支异常处理。

【算法分析】

本例中程序的功能是做整数除法运算,即从键盘输入两个整数,然后进行除法运算。在输入过程中可能会出现各种错误,例如除数为0、输入了非数字内容等。在编程过程中,将进行除法运算的代码放在try子句中,而将异常处理的代码放在except子句中,各种类型的错误在这里可以进行统一处理。

【程序代码】

【运行结果】

再次运行程序:

再次运行程序:

2.多分支异常处理

在多分支异常处理中,try-except语句的语法格式如下:

其中try后面的语句块包含可能引发异常的语句;各个异常类用以指定待捕获的异常类型;“as错误描述”为可选项;语句块、异常处理语句块以及默认处理语句块都可以包含单个或多个语句,使用单个语句时,可以与try或except位于同一行,使用多个语句时,这些语句必须具有相同的缩进量。

多分支异常处理语句可针对不同的异常类型进行不同的处理,其执行流程如下:执行try后面的语句块,如果未发生异常,则执行该语句块后执行else后面的语句块(如果有异常的话),然后执行try-except语句的后续语句;如果引发异常,则依次检查各个except语句,试图找到所匹配的异常类型;如果找到了,则执行相应的异常处理语句块;如果未找到,则执行最后一个except语句中的默认异常处理语句块;异常处理完成后执行try-except语句的后续语句。

【例2.18 】 整数除法中的多分支异常处理。

【算法分析】

本例中程序的功能仍然是做整数除法运算,即从键盘输入两个整数,然后进行除法运算。在输入过程中可能会出现各种错误,例如除数为0、输入了非数字内容等。在编程过程中,将进行除法运算的代码放在try子句中,而将异常处理的代码放在不同的except子句中,这样可以根据错误类型的不同分别进行不同的处理。

【程序代码】

【运行结果】

再次运行程序:

再次运行程序:

2.4.3 try-finally语句

try-finally语句用于指定无论是否发生异常都会执行的代码,其语法格式如下:

finally子句总是在离开try语句之前执行,无论是否发生了异常。如果在try子句中发生异常并且没有被except子句处理,或者在except或else子句中发生了异常,则在finally子句执行之后这个异常将被重新引发。

【例2.19 】 整数除法中的异常处理,展示finally子句的应用示例。

【算法分析】

本例中仍然是做整数除法运算,即从键盘输入两个整数,然后进行除法运算。与例2.18有所不同的是,在本例中并没有处理TypeError,也没有启用默认的异常处理,只是增加了一个finally子句。

【程序代码】

【运行结果】

再次运行程序:

再次运行程序:

习题2

一、选择题

1.在下列各项中,()不属于流程控制结构。

A.顺序结构

B.输入/输出结构

C.循环结构

D.选择结构

2.在下列语句中,会导致语法错误的是()。

A.x,y=y,x

B.x=y=z

C.x+=y

D.x=(y=z)

3.在下列语句中,正确的赋值语句是()。

A.x=y=3

B.x+y=3

C.x=3y

D.2x=3y+1

4.设x=3,则语句x*=x+6执行后变量x的值为()。

A.9

B.27

C.18

D.12

5.要输出一个八进制数,可以使用的格式说明符为()。

A.%d

B.%c

C.%s

D.%o

6.以0作为除数时将会引发()错误。

A.ZeroDivisionError B.AttributeError C.IndexError

D.NameError

二、判断题

1.若x=30,y=90,则条件表达式x if x>y else y的值为30。

2.()while循环至少会执行一次。

3.()在Python中,for语句用于遍历任何有序序列对象中的所有元素。

4.()在Python中,break语句和continue语句均可用于循环语句中,两者的作用完全相同。

三、编程题

1.编写程序,从键盘输入圆的半径,计算并输出圆的周长和面积。

2.编写程序,从键盘输入三角形的底和高,计算并输出三角形的面积。

3.编写程序,从键盘输入两点的坐标(x1,y1)和(x2,y2),计算并输出两点之间的距离。

4.编写程序,从键盘输入3个整数,输出其中的最大数。

5.编写程序,从键盘输入一个年份,判断这一年是不是闰年。

6.编写程序,从键盘输入 a b c 的值,求解一元二次方程 ax 2 + bx + c =0,根据判别式 b 2 -4 ac 的取值为正数、0或负数分别进行计算。

7.编写程序,从键盘输入三角形的三边长,计算三角形的面积。

8.编写程序,从键盘输入一个年份,计算并输出这一年份对应的生肖。

9.编写程序,输出全部水仙花数。

10.编写程序,求解爱因斯坦的阶梯问题:有一个长阶梯,若每步上2阶,最后剩1阶;若每步上3阶,最后剩2阶;若每步上5阶,最后剩4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后刚好一阶也不剩。计算该阶梯至少有多少阶。

11.编写程序,输出乘法口诀表。

12.编写程序,从键盘输入两个数字,将第一个数字除以第二个数字并输出结果,要求在程序中添加异常处理功能。 rsbEq6t5tH0SST9DW5cMa+CcgD6xdSfE6lDrphmITLc+87GEg2BkWF84e5ggUeax

点击中间区域
呼出菜单
上一章
目录
下一章
×