每日一记
IndexError 索引超出序列的范围 KeyError 字典中查找一个不存在的关键字 NameError 尝试访问一个不存在的变量 IndentationError 缩进错误 AttributeError 尝试访问未知的对象属性 StopIteration 迭代器没有更多的值 AssertionError 断言语句(assert)失败 EOFError 用户输入文件末尾标志EOF(Ctrl+d) FloatingPointError 浮点计算错误 GeneratorExit generator.close()方法被调用的时候 ImportError 导入模块失败的时候 KeyboardInterrupt 用户输入中断键(Ctrl+c) MemoryError 内存溢出(可通过删除对象释放内存) NotImplementedError 尚未实现的方法 OSError 操作系统产生的异常(例如打开一个不存在的文件) OverflowError 数值运算超出最大限制 ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象 RuntimeError 一般的运行时错误 SyntaxError Python的语法错误 TabError Tab和空格混合使用 SystemError Python编译器系统错误 SystemExit Python编译器进程被关闭 TypeError 不同类型间的无效操作 UnboundLocalError 访问一个未初始化的本地变量(NameError的子类) UnicodeError Unicode相关的错误(ValueError的子类) UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类) UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类) UnicodeTranslateError Unicode转换时的错误(UnicodeError的子类) ValueError 传入无效的参数 ZeroDivisionError 除数为零
异常处理
1, 基本格式
# 捕捉异常错误,防止异常抛错,终止程序. try: # 可能出现异常的代码 lst = [1,2,3] print(lst[10]) except: print("出现异常") # AssertError 断言失败错误 """ 断言就是猜的意思 assert 和 if 之间的区别在于 assert 在断言失败时候,是直接报错,抛出异常,后面的代码直接终止了. if 在判断为False 的时候,不执行代码 """
2, 分支结构
# except + 异常错误类 特指发生在这类异常错误时,要执行的分支 try: lst = [1,2,3] print(lst[10]) except KeyError : print("没有这个键而发生错误") except IndexError : print("索引超出范围!") # 只执行第一次报错的特指异常,往后不再执行
3, 迭代器异常错误处理
def gen_func(): print("生成器") yield 1 yield 2 yield 3 return 4 try : gen = gen_func() print(next(gen)) print(next(gen)) print(next(gen)) print(next(gen)) # 没有执行return语句,因为错误 except StopIteration as e : # e是对象,底层有__str__方法,print时自动触发 print(e,"生成器迭代结束!")
4, 异常处理大组合
# try , except , else , finally try: lst = [1,2,3] print(lst[10]) except KeyError: print("没有这个键而发生错误") except IndexError : print("索引超出范围!") else : print("没有异常") finally: print("无论如何都要执行")
5, 主动抛出异常 raise
# 基本格式 try: raise BaseException except BaseException: print("出现错误")
5.1,自定义异常类
# 系统底层获取行数和文件名的函数 (只有在程序异常时才能触发) def return_errorinfo(n): import sys f = sys.exc_info()[2].tb_frame.f_back if n==1: return str(f.f_lineno) # 返回当前行数 elif n == 2: return f.f_code.co_filename # 返回文件名 # 自定义错误信息类 class MyException(BaseException): def __init__(self,num,msg,line,file): # 错误号 self.num = num # 错误信息 self.msg = msg # 错误行号 self.line = line # 错误文件 self.file = file # 主动抛出异常 def raise_func(n): try : raise except: return return_errorinfo(n) # 捕捉自定义异常类信息 sex = "雌雄同体" try: if sex == "雌雄同体": # raise + 异常错误类 或者 异常错误类对象 raise MyException(404,"醒醒吧老弟,人类没有雌雄同体~",get_value(1),get_value(2)) except MyException as e: # 对象.属性 print(e.num) print(e.msg) print(e.line) print(e.file)