3.5异常处理
1 .恼人的bug
在运行时编译器才会发现的错误被称为运行时错误 (Runtime Error)。由于Python是动态语言,许多操作必须在运行时才会执行,比如确定变量的类型等。因此,Python要比静态语言更容易产生 运行时错误。
还有一种错误,称为语义错误(SemanticError)。编译器认为你的程序没有问题,可以正常运行。但当检查程序时,却发现程序并非你想做的。
2. Debug
在程序内部插入简单的printI( )函数,就可以查看变量的状态以及运行进度。有时,还可以将 某个指令替换成其他形式,看看程序结果有何变化,从而验证自己的假设。当其他可能性都排除了,那么剩下的就是导致错误的真正的原因。
有一种开发程序的方式,就是测试驱动开发(Test-Driven Development, TDD)。对于Python这样一种便捷的动态语言来说,很适合先写一个小型的程序, 实现特定的功能。然后,在小程序的基础上,渐进地修改,让程序不断进化,最后满足复杂的需求。整个过程中,你不断增加功能,也不断改正某些错误。
3.异常处理
对于运行时可能产生的错误,我们可以提前在程序中处理。这样做有两个可能的目的:一个是让程序中止前进行更多的操作,比如提供更多的关于错误的信息。另一个则是让程序在犯错后依然能运行下去。异常处理还可以提高程序的容错性。
下面的一段程序就用到了异常处理:
while True:
inputStr=input("Please input a number:")
try:
num=float(inputStr)
print("Input number:",num)
print("result:",10/num)
except ValueError:
print("Illegal input. Try Again.")
except ZeroDivisionError:
print("Illegal devision by zero. Try Again.")
如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception 1、exception2......直到找到其归属,执行相应的except中的语句。如果try中没有异常,那么except部分将跳过,执行else中的语句。finally是无论是否有异常,最后都要做的一些事情。
如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。如果无法将异常交给合适的对象,那么异常将继续向上层抛出,直到被捕捉或者造成主程序报错。
使用raise关键字,我们也可以在程序中主动抛出异常。比如:
raise ZeroDivisionError()