异常处理
异常是程序运行过程中发生的非正常情况,是一个错误发生时的信号
异常如果没有被正确处理的话,将导致程序被终止,这对于用户体验是非常差的,可能导致严重的后果
处理异常的目的就是提高程序的健壮性
1. 异常类型:NameError
2. 异常信息: name 'name' is not defined
3. 异常位置:File "C:/Users/wangyong/Desktop/test/练习/test.py", line 1, in <module>
TypeError: 'int' object is not subscriptable 对象不能被切片 TypeError: 'list' object is not callable 对象不能被调用 IndexError: list index out of range 索引超出范围 TypeError: 'builtin_function_or_method' object is not iterable 对象不能被迭代 KeyError: 'xxx' 不存在这个key FileNotFoundError: [Errno 2] No such file or directory: 'xxxxx' 文件找不到
try: 可能出错的代码 except 出错的类型 as e: # 将报错信息赋值给变量e 出错之后的处理机制
try: # 代码块 except Exception: # 万能异常 所有的异常类型都被捕获(代码块报错时执行) # print('老子天下无敌') else: # 代码块没有错误时执行 # print('被检测的代码没有任何的异常发生 才会走else') finally: # (最后一定执行) # print('无论被检测的代码有没有异常发生 都会在代码运行完毕之后执行我')
断言 其实可以理解为断定的意思
即非常肯定某个条件是成立的
条件是否成立其实可以使用if来判断
其存在的目的就是 为了简化if 判断而生的l = [1,2,3] assert len(l) < 0 # 断言 预言 # 猜某个数据的状态 猜对了 不影响代码执行 正常走
# 当系统提供异常类不能准确描述错误原因时 就可以自定义异常类,继承自Exception即可 class MyException(Exception): passclass MyError(BaseException): def __init__(self,msg): super().__init__() self.msg=msg def __str__(self): return '<dfsdf%ssdfsdaf>' %self.msg raise MyError('我自己定义的异常') # 主动抛出异常其实就是将异常类的对象打印出来,会走__str__方法
当我们做功能的提供者,给外界提供一个功能接口
但是使用者不按照相应的方式来使用,或者参数类型不正确等原因,导致功能无法正常执行时,就应该主动抛出异常
主动抛出异常使用raise 关键字
后面可以跟任何Exception的子类 或是 对象# 直接抛出异常 raise TypeError # 直接抛出异常 并附加错误信息 raise TypeError("类型错误")