异常处理:通过捕获异常的方式获取这个异常的名称,再通过其他的逻辑代码让程序继续运行,这种根据异常做出的逻辑处理就叫做异常处理。 分类: 1.语法错误(不属于异常处理范畴) 2.运行时错误(Exception异常) 编程中常见的异常: 1.AttributeError:当试图访问的对象属性不存在时抛出的异常 2.IndexError:索引超出序列范围时引发此异常 3.KeyError:字典中查找一个不存在的关键字时引发此异常 4.NameError:尝试访问一个未声明的变量时引发此异常 5.TypeError:不同类型数据之间的无效操作 用if作为错误处理机智的问题: 1.无法穷举所有的异常情况 2.错误处理代码和业务实现代码之间互相混杂,严重影响程序的可读性,增加程序维护的难度。 异常处理的基本语法1:except块--except块后面不跟特定的块则会捕获所有的异常,并且获取异常按照except块顺序执行 try:#引发异常 可能产生异常的代码块 except[(Exception1,Exception2,....)[as e]]: 处理异常的代码块1 except[Exception3[as e]]:#捕获异常 处理异常的代码块2 except: 处理异常的代码块3 例子1: try: a=input(input('请输入被除数')) b=input(input('请输入除数')) c=a/b print('您输入的两个数相除的结果是:',c) except ValueError: print('程序发生了数字格式异常') except ArithmeticError: print('程序发生了算术异常') except: print('程序遇到了未知异常') print('程序正常运行!') 异常处理的基本语法2:else块--当try块没有发现异常时,程序则执行else块的代码;当try块发现异常时,程序则不会执行else块的代码 try:#引发异常 可能产生异常的代码块 except[(Exception1,Exception2,....)[as e]]: 处理异常的代码块1 except[Exception3[as e]]:#捕获异常 处理异常的代码块2 except: 处理异常的代码块3 else:#大部分语法中是将else块的代码放在try块处,当try和else块没有出现错误则是一样的效果,如果出现异常的话在try块就会捕获异常,在else块不会捕获异常直接抛出异常 程序未发生异常时执行的代码 #例子2: try: a=input(input('请输入被除数')) b=input(input('请输入除数')) c=a/b print('您输入的两个数相除的结果是:',c) except ValueError: print('程序发生了数字格式异常') except ArithmeticError: print('程序发生了算术异常') except: print('程序遇到了未知异常') else: print('没有出现异常') print('程序正常运行!') #例子3: def else_test(): S=input('请输入除数') result=20/int(s) print('运算结果为:',result) def right_main(): try: print('try块运行,没有出现异常') except: print('程序出现异常') else: else_test() def wrong_main(): try: print('try块运行,没有出现异常') else_test() except: print('程序出现异常') right_main() wrong_main() 异常处理的基本语法3:finally--无论是否出现异常均会执行finally块 try:#引发异常 可能产生异常的代码块 except[(Exception1,Exception2,....)[as e]]: 处理异常的代码块1 except: 处理异常的代码块2 else:#大部分语法中是将else块的代码放在try块处,当try和else块没有出现错误则是一样的效果,如果出现异常的话在try块就会捕获异常,在else块不会捕获异常直接抛出异常 程序未发生异常时执行的代码 finally: 资源回收块
异常处理执行流程:
在python中异常处理㞏结构中有如下的原则: 1.只有try块是必须的,如果没有try块,则不能有后面的except块和finally块; 2.except块和finally块都是可选的,但except和finally块至少出现其中之一,也可以同时出现; 3.可以有多个except,但是在捕获父类异常的except块应该位于捕获子类异常的except块后面; 4.不能只有try块,既没有except块也没有finally块; 5.多个except块必须位于try块之后,finally块只要出现就必须位于所有块最后; 列子4: def demo(): try: print('try块中') return 1 except: print('except块中') return 2 finally: print('finally块中') return 3 print(demo()) 异常处理的基本语法4:raise块在except中使用,则会直接抛出不会处理异常;如果raise块在try中则会捕获异常 raise语句自定引发异常: 语法:raise[Exception)[(reason)]] raise语句三种常用的用法: 1.raise:单独一个raise,该语句引发当前上下文中捕获的异常(比如在except块中),或默认引发RuntimeError异常。 2.raise异常类名称:raise后带一个异常类名称,该语句引发指定异常类的默认实例。 3.raise异常类名称(描述信息):在引发指定异常的同时,附带异常的描述信息。 列子1:处理用户引发异常的两种方式 def main(): try: mtd(3) except Exception as e: print('程序出现异常',e) mtd(3) def mtd(a): if a>0: rasie ValueError('a的值大于0,不符合要求') if __name__='__main__': try: main() except: pass 列子2:不带参数的raise用法 def demo(): try: a=1/0 except ZeroDivisionError as e: print('程序出现异常',e) raise demo() python中指定自定义的异常AuctionException class AuctionException(Exception): pass class Auction: def __init__(self): self.price=100 def auction(self,price): if price< self.price: raise AuctionException('竞价出价不能低于起拍价格') else: self.price=price auction=Auction() try: auction.auction(80) print('当前竞价价格为:',auction.price) except Exception as e: print(e) 一个成功的异常处理程序应该实现的目标: 1.使程序代码混乱最小化 2.捕获并且保留异常信息 3.通知合适的人员 4.采用核实的方式结束异常活动 如何才能达到这些目标: 1.不要过度地使用异常,比较常见的使用异常来代替流程控制。 #列子1:度地使用异常 alist=['hello','mili','python'] try: i=0 while Ture: print(alist[i]) i +=1 except: pass #列子2:流程控制代码的执行 i=0 while i <len(alist): print(alist[i]) i +=1 2.不要使用过度庞大的try块 3.不要忽略捕获到的异常