异常处理异常是程序中发生错误的信号。一旦程序出现错误,就会产生异常。如果程序不处理,就会抛出异常,程序的运行也就随之终止。异常一般分为语法错误SynataxError,这种错误应该在程序运行前纠正,另一种是逻辑错误1.异常处理语法try:检测到的代码块exceptExceptiontype:当检测到异常时,逻辑在这个位置执行try:print('start...')print(x)#引用了一个不存在的名字,触发异常NameErrorprint('end...')exceptNameErrorase:#The由于语法将异常类型的值赋给了变量e,这样我们通过打印e就可以知道错误原因print('异常值为:%s'%e)print('runothercode...')#执行结果为start...异常值为:name'x'isnotdefinedrunothercode...检测到的代码块中异常发生位置之后的代??码将不会执行。而是会执行匹配异常的except子代码m模块,其余代码正常运行,针对不同的异常处理IndexError触发时对应的处理逻辑passexceptKeyError:#KeyError触发时对应的处理逻辑passexampledefconvert_int(obj):try:res=int(obj)exceptValueErrorase:print('ValueError:%s'%e)res=NoneexceptTypeErrorase:print('TypeError:%s'%e)res=Nonereturnresconvert_int('egon')#结果:ValueError:in以10为底的int()的有效文字:'egon'convert_int({'n':1})#结果:类型错误:int()参数必须是字符串、类字节对象或数字,而不是'dict'多异常优化try:#检测到的代码块passexcept(NameError,IndexError,TypeError):#触发NameError,IndexError或TypeError时对应的处理逻辑passdefconvert_int(obj):try:res=int(obj)except(ValueError,TypeError):print('argumentmustbenumberornumericstring')res=Nonereturnresconvert_int('egon')#Result:argumentmustbenumberornumericstringconvert_int({'n':1})#Result:argumentmustbenumberornumericstringExceptionException是一个通用的异常处理类逻辑c这里的Passelse也可以在多个excepts之后跟一个else(else必须跟在except之后,不能单独存在),只有检测到的代码块没有触发任何异常才会执行elsetry的子代码块:#检测到的代码块passexceptNameError:passexceptIndexerror:pass#......else:#pass没有异常发生时执行的代码块passfinallytry也可以和finally结合使用。从语法上讲,finally必须放在else之后,但是可以使用try-except-finally的形式,也可以直接使用try-finally的形式,无论检测到的代码什么时候触发异常,finally子代码block会被执行,所以通常finally子代码块会执行一些资源回收操作,比如关闭打开的文件,关闭数据库Connection等。try:#DetectedcodeblockpassexceptIndexError:passexceptNameError:pass#......else:#没有异常发生时执行的代码块passfinally:#无论是否发生异常都执行的代码块passraiseneeds有些程序需要自己显式触发异常,这就用到了raise语句。引发后必须是异常类或异常实例类Student:def__init__(self,name,age):ifnotisinstance(name,str):raiseTypeError('namemustbestr')ifnotisinstance(age,int):raiseTypeError('agemustbeint')self.name=nameself.age=agestu1=Student(4573,18)#TypeError:namemustbestrstu2=Student('egon','18')#TypeError:agemustbeint自定义异常类继承Exception#自定义异常类,继承ExceptionclassShortInputError(Exception):def__init__(self,length,min_len):self.length=lengthself.min_len=min_len#设置抛出异常的描述信息def__str__(self):returnf'你输入的长度为{self.length},不能小于{self.min_len}个字符'defmain():try:con=input('Pleaseenterthepassword:')iflen(con)<3:raiseShortInputError(len(con),3)exceptExceptionasresult:print(result)else:print('ThepasswordhasbeenenteredComplete')main()classPoolEmptyError(Exception):#可以通过继承Exception来定义新的异常def__init__(self,value='Theproxysourceisexhausted'):#可以自定义初始化methodsuper(PoolEmptyError,self).__init__()self.value=valuedef__str__(self):#可以定义该方法来自定义触发异常时打印异常值的格式return'<%s>'%self.valueraisePoolEmptyError#Result:__main__.PoolEmptyError:
