Python中的异常处理学习笔记
Python是面向对象的语言,所以程序抛出的异常也是类。
常见的异常类
1.NameError:尝试访问一个没有申明的变量
2.ZeroDivisionError:除数为0
3.SyntaxError:语法错误
4.IndexError:索引超出序列范围
5.KeyError:请求一个不存在的字典关键字
6.IOError:输入输出错误(比如你要读的文件不存在)
7.AttributeError:尝试访问未知的对象属性
8.TypeError:传给函数的参数类型不正确,比如给int函数传入字符型
自定义异常类
尽管内建的异常类已经包括大部分情况,但如果需要创建自己的异常类,可以采用下面的方法:
classCustomException(Exception):#Exception为所有异常的基类 #处理异常的代码
捕获异常
try: #需要进行捕获异常的代码,只有出现异常之前的代码被最终执行 except(Exception1,Exception2,...)asargument: #捕获到(Exception1,Exception2,...)里的异常才执行本段代码 #argument是一个异常类的实例,包含异常的具体信息 except: #捕获到(Exception1,Exception2,...)以外的异常执行本段代码,用sys模块的exc_info()函数可以获取异常信息 else: #如果没有捕获到异常则执行本段代码 finally: #无论是否捕获到异常都执行本段代码
上述语句并不都是必须的,譬如try...except...、try...finally...或者try...except...else...语句都是可行的。我们还可以用try...except...else...代替if...else...。
抛出异常
如果我们想要在自己编写的程序中主动抛出异常,可以采用如下两种方法:
raiseException(reason)
Exception必须是一个异常类的名称。可选项reason用来传递异常的信息。
assertexpression[,reason]
assert是断言的关键字。当表达式expression为真则什么都不做,否则抛出AssertionError异常。reason提供异常的信息。
上下文管理器
由于对象File支持上下文管理协议,因此可以采用下面的方法打开文件:
withopen('filename')asfp: #无论本段代码是否出现异常,文件对象fp均能正确关闭
Example
importsys
defdiv(num,den): print('_________________ (',num,',',den,')\n') try: ans=num/den assertden!=num,'Equal'#断言:分子分母不相等 den='Changed' #如果执行本语句之前未出现异常,改变den的值 ifnum%2: #如果分子为奇数,则抛出异常 raiseValueError('Odd') exceptZeroDivisionErrorase: print('except...as...\n\t',e) except: print('except\n\t',sys.exc_info()) else: print('else\n\t',ans) finally: print('finally\n\t',den)
div(1,0) #除数为零,为ZeroDivisionError异常类 div(1,1) #分子等于分母,断言为假,抛出异常 div(2,1) #无异常 div(3,1) #分子为奇数,通过raise抛出异常 div(3,'x') #不属于ZeroDivisionError的其他异常