异常是指程序运行期间出现错误或意外情况。一般情况下,在Python无法正常处理程序时就会发生一个异常。引发异常有各种各样的原因,例如命名错误、数据类型错误等。Python提供了一套完整的异常处理方法,可以用来对各种可预见的错误进行处理。
在Python中,异常是以对象的形式实现的。BaseException类是所有异常类的基类,而其子类Exception则是除SystemExit、KeyboardInterrupt和GeneratorExit这3个系统级异常之外所有内置异常类和用户自定义异常类的基类。
Python中常见的标准异常详见表2-4。
表2-4 Python中的常见标准异常
在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子句中,这样可以根据错误类型的不同分别进行不同的处理。
【程序代码】
【运行结果】
再次运行程序:
再次运行程序:
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.编写程序,从键盘输入两个数字,将第一个数字除以第二个数字并输出结果,要求在程序中添加异常处理功能。