《python学习手册》第32章 异常基础
发生异常与默认的异常处理
def fun(a,b): return a[b] print(fun(\'nihao\',20))
会出现异常,异常信息一般是这样的
Traceback (most recent call last): File "D:\application\eclipse\workspace\yichang\c1\test1.py", line 8, in <module> print(fun(\'nihao\',20)) File "D:\application\eclipse\workspace\yichang\c1\test1.py", line 7, in fun return a[b] IndexError: string index out of range
捕获异常和异常恢复
def fun(a,b): return a[b] try: fun(\'nihao\',20) except IndexError: print(\'nihao\')
运行以后的结果是: nihao
def fun(a,b): return a[b] try: fun(\'nihao\',20) except IndexError: print(\'nihao\') print(\'dajiahao\')
这个时候运行结果如下:
nihao dajiahao
说明我们后面的代码能够正常运行。try代码块执行时触发异常,python会自动跳至处理器。处理以后,程序继续向后进行,这样当我们的代码出现异常的时候我们的程序就不会终止了。
引发异常
除了上面程序运行当中出现的异常,我们可以自己引发异常,比如使用raise
try: raise IndexError except IndexError: print(\'got indexerror\')
运行结果如下: got indexerror
除了raise以外,assert可以用来触发异常–它是一个有条件的raise
用户定义异常
我们可以自己定义自己的异常类,通过继承一个内置的异常类,通常为Exception。基于类的异常允许脚本建立异常类型,继承行为以及附加状态信息。 例如,运行下面的代码:
class Bad(Exception): pass try: raise Bad() except Bad: print(\'Bad Exception\')
将会得到结果: Bad Exception
终止行为
在try后面除了跟except异常处理器以外,还可以跟finally,与except不同的是,可以定义一定会在执行时收尾的行为,无论try代码块中是否发生异常。
当try代码块中有异常时:
def fun(a,b): return a[b] try: fun(\'hello\',20) finally: print(\'finally excute\') print(\'fun excute?\')
执行的结果如下:
finally excute Traceback (most recent call last): File "D:\application\eclipse\workspace\yichang\c1\finally.py", line 9, in <module> fun(\'hello\',20) File "D:\application\eclipse\workspace\yichang\c1\finally.py", line 7, in fun return a[b] IndexError: string index out of range
可以看到,try中发生异常,最终执行了finally里面的语句,但是try-finally之后的语句是不被执行的,这是因为,异常发生时,控制权在try-finally代码块后中断了。python跳回去执行finally的行为,然后把异常向上传播到前一个处理器(在这个例子中,为顶层的默认处理器)。
当try代码块没有异常的时候:
def fun(a,b): return a[b] try: fun(\'hello\',3) finally: print(\'finally excute\') print(\'fun excute?\')
运行结果如下:
finally excute fun excute?
可以看到,无论如何finally 里面的代码都会被执行。
python还提供了一种try-finally的一种替代:with-as语句。
总结一下: