python的异常处理及异常类定义
python的异常处理语法和大多数语言相似:
try:
try块的语句...
except exceptiontype1 as var:#使用as语句获得本次捕获到的异常的实例var
except块语句...
except exceptiontype2 as var:
except块语句...
except:
except块语句...
else:
else块语句...
finally:
finally块语句...
执行的流程分两类:
1.try->若有异常发生->except->finally
2.try->若无异常发生->else->finally
其中try块执行了可能抛出异常的语句,except块负责处理抛出的异常,处理的尝试顺序与多个except块的编写顺序一致,当尝试发现第一个异常类型匹配的except块时就进入该块内执行该except块的语句,最后一个不指定异常类型的except: 块匹配任何类型的异常(由于所有异常都继承自Exception类所有except Exception:与不指定异常类型效果一致)。
except块至少要有一个,可以使用pass语句如
except:
pass
表示“抓到”异常后不进行任何处理。
finally类是可选的块,如前面的流程所示,无论是否有异常抛出,只要finally块存在就会被最终执行(该块中的语句一般用于关闭打开的资源,比如在try块中打开的磁盘文件)
此外,python中提供另一种简单的写法:with...as...方式
如
with open('abc.txt', 'r') as f:
f语句块....
上面的f就是打开的文件对象,而采用with..as..方式会在执行完f语句块后自动关闭打开的文件资源,而不用自己写finally语句块。
至于背后的机理,实际上面的with...as...语句在进入f语句块之前调用open对象(注意python中函数也是对象,具有__call__方法的对象都可以当函数用)
的__enter__方法,该方法的返回值赋值给as后面的f,再在执行完f语句块后调用open对象的__exit__方法,而open对象作为python的内置对象默认的__enter__方法返回文件对象而__exit__方法刚好关闭了打开的文件资源从而使我们用起来感觉像方便版的try ,finally。
了解了上面的内容后,下面定义我们自己的新的异常类(这在实际开发过程中非常有用):
class myerr(Exception): def __init__(self,err): Exception.__init__(self) self.err=err try: raise myerr('myexception') except myerr as var : print(var.err)
定义自己的异常类一般都继承自Exception类,初始化时同时使用Exception类的__init__方法,此外,可以通过添加一个err属性用于存放错误信息,方便在后续的异常处理中可以根据错误信息的不同来进行不同的处理。
引发自己定义的异常的语法是raise exceptiontype(arg...),直接生成该异常类的一个实例(实例化时需要的参数自行提供)并抛出该异常
在捕获异常时使用except exceptiontype as var的语法获取异常实例var,从而可以在后续的处理中访问该异常实例的属性。
如上面代码的输出为:
myexception