一 什么是异常
异常指的是与正常情况不同。异常就是程序运行时发生错误的信号,在程序执行过程中,出现了错误,导致代码无法继续执行下去,就称之为异常。实例如图:
异常的三个组成部分:异常的追踪信息、异常的类型、异常的值。
错误的类型又分为两种,在抛出异常时又有不同。
print("语法错误") a= >>>: File "D:/学习/old_boy_study/1.py", line 2 a= ^ SyntaxError: invalid syntax
print("逻辑错误") a=[1,2,3] print(a[3]) print("逻辑错误") >>>: 逻辑错误 Traceback (most recent call last): File "D:/学习/old_boy_study/1.py", line 3, in <module> print(a[3]) IndexError: list index out of range
二 异常的类型
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 索引不存在 KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError 语法错误 TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的 常用异常
三 异常的处理
正确处理异常的三种方式:
1.如果能明确知道异常发生的原因,便不要产生异常,使用if判断等方式进行避免错误 2.不知道发生异常的原因,但是知道异常的类型,那就明确捕获该类型的异常 3.即不知道发生异常的原因,也不知道异常的类型,可以使用万能异常类型(Exception),但是必须注意一点,必须打印异常的消息。
异常处理的8种语法:(当try中的代码参数了异常后,try中之后的代码便不会再运行,会直接跳到except中运行相应的语句)
try: a=[1,2,3] print(a[3]) except IndexError: #捕捉一种异常类型 print("发生了index Error")
语法2:try..多个except..捕捉多个类型异常
try: a=[1,2,3] print(a[3]) b=int('abc') except (ValueError,IndexError): print("发生了 ValueError 或者 IndexError")
try: # 把可能发出错误的代码放到try中 print("start") # a = int("abc") # li[1] 10 / 0 dic = {} dic["name"] print("over") except Exception: print("可能是任何类型的错误 反正是发生错误了")
try: # 把可能发出错误的代码放到try中 print("start") # a = int("abc") # li[1] 10 / 0 dic = {} dic["name"] print("over") # 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息 except Exception as e: print("可能是任何类型的错误 反正是发生错误了") print(e) print(type(e))
# 语法6 先捕获能够明确的异常类型 最后捕获万能异常类型 try: # 把可能发出错误的代码放到try中 print("start") a = int("abc") li[1] 10 / 0 dic = {} dic["name"] print("over") except ValueError: print("值不对.....") except ZeroDivisionError: print("除数不能为0") # 可以通过给异常取别名 来获取异常的对象 对象中包含了错误信息 except Exception as e: print("可能是任何类型的错误 反正是发生错误了") print("over")
try: a=[1,2,3] print(a[2]) b=int('5') except (ValueError,IndexError): print("发生了 ValueError 或者 IndexError") else: print("没有发生异常")
try: a=[1,2,3] print(a[3]) b=int('5') except (ValueError,IndexError): print("发生了 ValueError 或者 IndexError") finally: print("执行了finall")
finally可用于资源的回收
四 自定义异常类
raise关键字
作用:主动抛出异常,后面跟任意Exception类型的子类。
为何要自定义异常类:
在我们用代码敲了一个功能,提供给别人使用时,别人不按照我们所定制的要求去使用,可能会导致程序出错,而且我们无法帮助用户处理这个错误,这个时候我们使用自定义异常类,主动抛出异常,不让用户这么操作,它的操作必须严格按照我们的要求。
class LoginException(Exception): pass def login(): name=input("name>>>:").strip() pwd=input("password>>>:").strip() if name=='egon' and pwd == '123' : print("登陆成功") else: raise LoginException("用户名密码错误!") login()
五 断言
断言即断定的意思,指有一段代码需要执行必须要保证某个条件成立,否则无法执行。
练习:
需求:列表中有一堆数据需要被处理,但是只有当列表中有数据时才执行处理代码,否则抛出异常。
names=[] if not names: raise TypeError("列表中没有数据") print("下面开始处理数据") print("处理数据的中。。。") print("数据处理完毕")
names=[] assert names #当names中不为空时,执行代码,不然抛出异常 print("下面开始处理数据") print("处理数据的中。。。") print("数据处理完毕")