一、异常的类型python中不同的异常可以通过不同的类型来标识,一个异常标识一个错误。1、常用异常类AttributeError试图访问一个对象没有的树,比如foo.x,但是foo没有属性xIOErrorInput/Output异常;基本上无法打开文件ImportError无法导入模块或包;基本上路径问题或名称错误IndentationError语法错误(子类);codenotalignedcorrectlyIndexError下标索引超出序列边界,例如当x只有三个元素时试图访问x[5]KeyError试图访问字典中不存在的键KeyboardInterruptCtrl+CPressedNameError使用变量hasnotbeenassignedanobjectSyntaxErrorPython代码不合法??,代码无法编译(我个人认为这是语法错误,写错了)TypeError传入对象的类型不符合要求UnboundLocalErrorTryingtoaccessavariablethathasnotbeenassigned设置局部变量基本上是因为还有一个同名的全局变量,导致你以为你在访问它。ValueError传入一个调用者不期望的值,即使值类型是正确的2.异常示例:#TypeError:intThetypeisnotiterableforiin3:pass#ValueErrornum=input(">>:")#Inputhelloint(num)#NameErroraaa#IndexErrorl=['egon','aa']l[3]#KeyErrordic={'name':'egon'}dic['age']#AttributeErrorclassFoo:passFoo.x#ZeroDivisionError:无法完成计算res1=1/0res2=1+'str'二、异常处理1、基本语法try...excepttry:ByDetectedcodeblockexcept异常类型:一旦在try中检测到异常,此时的逻辑位置被执行示例尝试:f=['a','a','a','a','a','a','a',]g=(line.strip()forlineinf)#tuple推导print(next(g))print(next(g))print(next(g))print(next(g)))print(next(g))exceptStopIteration:f.close()异常类只能用来处理指定的异常,如果不是指定的异常无法处理s1='hello'try:int(s1)exceptIndexErrorase:#未捕获的异常,直接程序报错print(e)2,多分支异常except..except和通用异常:Exceptions1='hello'try:int(s1)exceptIndexErrorase:print(e)exceptKeyErrorase:print(e)exceptValueErrorase:print(e)exceptExceptionase:print(e)3,try/except...elsetry/except语句还有一个可选的else子句,如果使用这个子句,必须放在allexcept子句之后.如果try子句中没有发生异常,else子句就会执行。对于arginsys.argv[1:]:try:f=open(arg,'r')除了IOError:print('cannotopen',arg)else:print(arg,'has',len(f.readlines()),'lines')f.close()4.finallytry-finally语句不管是否发生异常都执行最后一段代码。定义清理行为:s1='hello'try:int(s1)exceptIndexErrorase:print(e)exceptKeyErrorase:print(e)exceptValueErrorase:print(e)#exceptExceptionase:#print(e)else:print('如果try中的代码块没有异常就执行我')finally:print('不管有没有异常,模块都会被执行,通常用于清理工作')invalidliteralforint()withbase10:'hello'无论是否有异常,这个模块都会被执行,通常用于清理工作3.抛出异常raisePython使用raise语句抛出指定的异常。raise的语法格式如下:raise[Exception[,args[,traceback]]]try:raiseTypeError('throwsanexception,typeerror')exceptExceptionase:print(e)raise唯一的参数指定了异常被抛出异常。它必须是异常或异常类(即Exception的子类)的实例。如果你只是想知道这是否引发了异常,并且不想处理它,那么一个简单的raise语句可以再次引发它。try:raiseNameError('HiThere')exceptNameError:print('Anexceptionflushby!')raise#Anexceptionfloughby!#Traceback(最近一次调用last):#File"",第2行,在?#NameError:HiThere四、自定义异常你可以通过创建一个新的异常类来拥有自己的异常。异常类直接或间接地继承自Exception类,例如:在这个例子中,类Exception的默认init()被覆盖。classEgonException(Exception):def__init__(self,msg):self.msg=msgdef__str__(self):returnself.msgtry:raiseEgonException('Exceptionthrown,wrongtype')除了EgonExceptionase:print(e)throwsanexception,typeerror1.基础异常类在创建可能抛出各种不同异常的模块时,通常的做法是为这个包创建一个基础异常类,然后基于这个基础类针对不同的错误条件创建不同的子类:大多数异常名称以“Error”结尾,就像标准异常名称一样。classError(Exception):"""该模块中异常的基类。"""passclassInputError(Error):"""Exceptionraisedforerrorsininput.Attributes:expression--发生错误的输入表达式message--错误解释"""def__init__(self,expression,message):self.表达=表达自我。message=messageclassTransitionError(Error):"""当一个操作尝试一个不允许的状态转换时引发不允许"""def__init__(self,previous,next,message):self.previous=previousself.next=nextself.message=message5.断言assertassert(断言)用于判断一个表达式,当表达式条件为假时触发异常。Assertions可以在条件不满足程序运行时直接返回错误,而不用等程序运行后crash发生。语法格式如下:assertexpression等价于:ifnotexpression:raiseAssertionErrorassert后面也可以跟参数:assertexpression[,arguments]等价于:ifnotexpression:raiseAssertionError(arguments)下面的例子判断当前系统是否为Linux,如果不满足条件,则直接触发异常,不执行以下代码:importsysassert('linux'insys.platform),"ThiscodecanonlybeexecutedunderLinux"代码接下来要执行#Traceback(最近一次调用last):#File"C:/PycharmProjects/untitled/run.py",line2,in#assert('linux'insys.platform),"Thiscodecanonlybe在Linux下执行"
