Python安全攻防:渗透测试实战指南
上QQ阅读APP看书,第一时间看更新

2.7 异常处理结构

对于每一种高级语言来说,异常处理结构不仅能够提高代码的鲁棒性,而且提高了代码的容错性,从而不会因为使用者的错误输入而造成系统崩溃,也可以通过异常处理结构为使用者提供更加友好的错误提示。引发程序异常的原因有很多种,较为常见的有除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