对于每一种高级语言来说,异常处理结构不仅能够提高代码的鲁棒性,而且提高了代码的容错性,从而不会因为使用者的错误输入而造成系统崩溃,也可以通过异常处理结构为使用者提供更加友好的错误提示。引发程序异常的原因有很多种,较为常见的有除0、下标越界等。
Python中提供了很多不同形式的异常处理结构,其基本思路都是先尝试执行代码,再处理可能发生的错误。
1.try…except…结构
在Python异常处理结构中,try…except…结构使用得最为频繁,其中try子句中的代码块为可能引发异常的语句,except子句用来捕获相应的异常。也可以解释为,当try子句代码块执行异常并且被except子句捕获时,执行except子句的代码块。
例如,在使用学校的学生成绩系统录入每科成绩时,要求输入0~100的整型数值,而不接受其他类型的数值,如果输入的值超出0~100这一范围,则会给出提示,示例代码如下:
#!/usr/bin/python #coding:utf-8 mathScore = input('数学成绩:') try: mathScore = int(mathScore) if(0<=mathScore<=100): print("输入的数学成绩为:",mathScore) else: print("输入不在本科成绩范围内。") except Exception as e: print('输入的数值有误!')
输出结果:
数学成绩:'a',输入的数值有误! 数学成绩:121,输入不在本科成绩范围内。
2.try…except…else…结构
上面的例子是通过try…expect…结构和if语句来判断学生的数学成绩是否在0~100范围中的,也可以通过try…except…else…结构进行编写。如果try代码的子句出现了异常且该异常被except捕获,则可以执行相应的异常处理代码,此时就不会执行else中的子句;如果try中的代码没有抛出异常,则继续执行else子句。
例如,将前面的示例用try…expect…else…结构实现:
#!/usr/bin/python #coding:utf-8 mathScore = input('数学成绩:') try: mathScore = int(mathScore) except Exception as e: print('输入的数值有误!') else: if(0<=mathScore<=100): print('输入的数学成绩为:',mathScore) else: print('请输入正确的数学成绩。')
输出结果:
数学成绩:'a',输入的数值有误! 数学成绩:121,请输入正确的数学成绩。
3.try…except…finally…结构
在try…except…finally…结构中,无论try子句是否正常执行,finally子句中的代码块总会得到执行。在日常开发过程中,该结构通常用来做清理工作,释放try子句中申请的资源。
例如,输入两个数值a,b进行除法运算,并输出最终结果。同时为了确保程序的鲁棒性,要求带有异常处理结构。鲁棒是指系统的健壮性,是在存在异常和危险的情况下系统生存的关键,这个结构示例如下:
#!/usr/bin/python #coding:utf-8 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('运行结束!')
输出结果:
a:1.0 b:2.0 0.5