# ### 异常处理 # IndexError 索引超出序列的范围 # lst = [1,2,3] # lst[1000] # KeyError 字典中查找一个不存在的关键字 # dic = {"a":1,"b":2} # dic["c"] # NameError 尝试访问一个不存在的变量 # print(wangwen112312313123123123123123123123123123s) # IndentationError 缩进错误 # if 5 == 5: # print(1) # print(2) # AttributeError 尝试访问未知的对象属性 # class MyClass(): # a = 100 # obj = MyClass() # obj.abc # StopIteration 迭代器没有更多的值 # it = iter(range(3)) # res = next(it) # res = next(it) # res = next(it) # res = next(it) # AssertionError 断言语句(assert)失败 """assert猜的意思 , 叫断言, 如果是正确的没有任何反应,代码正常执行 如果是错误的直接报错,终止程序 """ # assert 5 < 3 # print(111)
try .. except .. 来抑制错误
把又可能报错的代码放到try这个代码块当中,
如果有报错,直接执行except这个代码块
如果没有报错,不执行except这个代码块
在异常处理当中,所有的异常错误类都继承 BaseException Exception 普通异常的父类(了解)
# 类型上的子父关系
from collections import Iterator,Iterable
print(issubclass(Iterator, Iterable))
class MyClass(): a = 6 try: lst = [1,2,3] lst[1000] except: pass try: lst = [1,2,3] lst[1000] except BaseException: pass
try: # lst = [1,2,3] # lst[1000] # dic = {"a":1,"b":2} # dic["c"] # print(lisi) MyClass.abc() except IndexError: print("下标越界1") except KeyError: print("字典的键不存在2") except NameError: print("这个变量不存在的3") except : print("有异常错误4")
def mygen(): yield 1 yield 2 yield 3 return [1,2,3] try: gen = mygen() print(next(gen)) print(next(gen)) print(next(gen)) print(next(gen)) # 给StopIteration这个类创建出来的对象起一个别名叫e """ 当你打印对象时,会触发内部__str__方法,通过一些列的调用,返回出最后的返回值 """ except StopIteration as e: # 可以获取返回值 print(e) """ # 额外的扩展 res = str(e) print(res , type(res) , "<======>") res2 = eval(res) print(res2,type(res2)) """
""" 1 .try .. except .. else .. 当try这个代码块当中没有报错的时候,执行else这个分支 如果try代码块有报错,就不执行else这个分支 """ try: # lst = [1,2,3] # lst[1000] print(123) except: pass else: print("执行了else分支 ... ") """ 2.try .. finally ... 无论代码是否报错,都必须要执行的代码写在finally这个代码块当中 场景:应用在异常环境下,保存数据或者关闭数据库等操作,必须要在数据库程序崩溃之前执行的代码写在finally代码块中; """ """ try: lst = [1,2,3] lst[1000] finally: print(234678) """ """3.try .. except .. else .. finally .. """ try: lst = [1,2,3] lst[1000] # print(123) except: print(456) else: print("执行了else分支 ... ") finally: print("执行关闭数据库操作")
BaseException 所有异常类的父类
Exception 普通异常类的父类
raise + 异常错误类 / 异常错误类对象
# (1) raise 基本语法 # raise KeyError # raise KeyError() """ try: raise except: pass try: raise except BaseException: pass """ # (2) 自定义异常错误类 """必须继承异常类的父类 BaseException """ # return_errorinfo必须在报错的情况下才能触发内部相应方法获取当前行号和文件名 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 #返回文件名 # 通过主动抛出异常,来获取响应的数据 def get_info(n): try: raise except: return return_errorinfo(n) # 自定义异常错误类 class MyException(BaseException): def __init__(self,error_num,error_msg,error_filename,error_linenum): self.error_num = error_num self.error_msg = error_msg self.error_filename = error_filename self.error_linenum = error_linenum eye = "轮回眼" try: if eye == "轮回眼": raise MyException( 404,"人类没有轮回眼",get_info(2) , get_info(1) ) except MyException as e: #给自定义MyException异常类的对象起个别名叫做e print(e.error_num) print(e.error_msg) print(e.error_filename) print(e.error_linenum)View Code
#系统底层获取行数和文件名的函数( 只有在程序异常时才能触发 ) 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 #返回文件名View Code
1 IndexError 索引超出序列的范围 2 KeyError 字典中查找一个不存在的关键字 3 NameError 尝试访问一个不存在的变量 4 IndentationError 缩进错误 5 AttributeError 尝试访问未知的对象属性 6 StopIteration 迭代器没有更多的值 7 AssertionError 断言语句(assert)失败 8 EOFError 用户输入文件末尾标志EOF(Ctrl+d) 9 FloatingPointError 浮点计算错误 10 GeneratorExit generator.close()方法被调用的时候 11 ImportError 导入模块失败的时候 12 KeyboardInterrupt 用户输入中断键(Ctrl+c) 13 MemoryError 内存溢出(可通过删除对象释放内存) 14 NotImplementedError 尚未实现的方法 15 OSError 操作系统产生的异常(例如打开一个不存在的文件) 16 OverflowError 数值运算超出最大限制 17 ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象 18 RuntimeError 一般的运行时错误 19 SyntaxError Python的语法错误 20 TabError Tab和空格混合使用 21 SystemError Python编译器系统错误 22 SystemExit Python编译器进程被关闭 23 TypeError 不同类型间的无效操作 24 UnboundLocalError 访问一个未初始化的本地变量(NameError的子类) 25 UnicodeError Unicode相关的错误(ValueError的子类) 26 UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类) 27 UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类) 28 UnicodeTranslateError Unicode转换时的错误(UnicodeError的子类) 29 ValueError 传入无效的参数 30 ZeroDivisionError 除数为零