对于每一种高级语言来说,异常处理结构不仅能够提高代码的鲁棒性,而且提高了代码的容错性,从而不会因为使用者的错误输入而造成系统崩溃,也可以通过异常处理结构为使用者提供更加友好的错误提示。引发程序异常的原因有很多种,较为常见的有除 0、下标越界等。
python 中提供了很多种不同形式的异常处理结构,其基本思路都是先尝试执行代码,再处理可能发生的错误

1.try...except... 结构

在 python 异常处理结构中,try...except... 结构使用的最为频繁,其中 try 子句中的代码块为可能引发异常的语句,except 子句用来捕获相应的异常。可以理解为:当 try 子句代码块执行异常并且被 except 子句捕获的时候,执行 except 子句的代码块

例:记录学生数学成绩,范围为 0~100 的整形数值,如超出范围则会有提示

代码:

1
2
3
4
5
6
7
8
9
score = input('数学成绩:')
try:
score = int(score)
if(0<score<=100):
print("数学成绩为:",score)
else:
print("超出最大范围")
except Exception as e:
print("输入错误!")

输入:

1
2
3
80
120
a

输出:

1
2
3
数学成绩为: 80
超出最大范围
输入错误!

这里刚开始我做转化成 int 型是在输入时直接进行转化了,比较呆,因此直接报出了错误,原理就是在输入的时候检测到了 a 不是整型数,且输入并没有在 try 语句当中,自然不会进行异常处理(就这个例题来说,异常处理的便是输入的不是整形的数值),因此直接报错。解决的办法便是将强制转换放入到 try 语句当中(如上代码),或者将强制转换的输入放入到 try 语句当中,就能进行异常处理了
2.try...except...else... 结构

该结构其实可以理解为结构 1
try...except.. 结构的改版,解释为:如果 try 语句中抛出异常被 except 捕获,则执行相应的异常处理代码,如果没有抛出异常,则执行 else 语句中的代码。相当于将有可能抛出异常的代码放入 try 中,而其它的代码放入 else 中,两者分离

代码:

1
2
3
4
5
6
7
8
9
try:
score = int(input('数学成绩:'))
except Exception as e:
print("输入错误!")
else:
if(0<score<=100):
print("数学成绩为:",score)
else:
print("超出最大范围")

输入:

1
2
3
80
120
a

输出:

1
2
3
数学成绩为: 80
超出最大范围
输入错误!

3.try...except...finally... 结构

在该结构中,无论 try 子句是否正常执行,finally 子句中的代码块总会得到执行。在日常开发过程中,该结构通常用来做清理工作。释放 try 子句中申请的资源
例:输入两个数值 a,b 进行除法运算,并输出最终的结果(要求带有异常处理结构)

1
2
3
4
5
6
7
8
9
a = int(input('a:'))
b = int(input('b:'))
try:
div = a/b
print(div)
except Exception as e:
print('The second parameter cannot be 0')
finally:
print('运行结束!')

输入:

1
2
a:1
b:5

输出:

1
2
0.2
运行结束!

当 b 为 0 即分母为 0 时发生异常,能被 except 捕获并输出
The second parameter cannot be 0

输入:

1
2
a:1
b:0

输出:

1
2
The second parameter cannot be 0
运行结束!

try...except...finally... 结构可以理解为 finally 就是为了确保设计程序时没有考虑到的异常处理而导致程序不能被完整的运行完并且进行清理,类似于文件处理时的 f.close (),起到一个收尾的作用,无论是否异常都会执行该代码块