【1】基本形式
【1.0】一般形式
try: 正文代码块1... 正文代码块2... 正文代码块3... except 具体错误类别 as e: # e为错误的具体信息变量 print("该类错误信息为",e) except Exception as e: # Exception 为所有错误类别,但缩进、语法等错误无法捕捉,因为那属于编译错误,只能肉眼排查 print("出错了,错误信息是:",e) else: # 如果 try 代码块没有异常错误,则会执行该模块 正文代码块4... finally: # 无论是否报错,该代码块也会执行 print("try except 代码块执行完毕")
案例
names = ['张三','李四'] data = {} try: a = 1 except (KeyError,IndexError) as e: print("Key没有找到,或者下标异常错误:",e) except IndexError as e: print("List 操作错误",e) except Exception as e: print("未知错误",e) else: print("如果没有异常发生,那么会执行我这个else,一切正常") finally: print("不管报不报错,我这个finally 还是要执行的")
【1.1】错误信息
names = ['张三','李四'] data = {} names[3]
File "D:/test.py", line 4, in <module>
names[3]
IndexError: list index out of range
names = ['张三','李四'] data = {} data['name']
File "D:/郭超群/学习/python/project/学习笔记/第7周_反射_错误处理_网络编程/test.py", line 5, in <module>
data['name']
KeyError: 'name'
总结:
我们可以发现,不同情况,有不同类别的错误
【1.2】try except 错误捕捉基本形式(常用)
names = ['张三','李四'] data = {} try: names[3] except KeyError as e: print("没有这个Key",e) except IndexError as e: print("List 操作错误",e)
输出:
List 操作错误 list index out of range
try: data['a'] except KeyError as e: print("没有这个Key",e) except IndexError as e: print("List 操作错误",e)
输出:
没有这个Key 'a'
【1.3】一个 except 包含多种错误类型捕获
通常用在,发生不同错误,但都用同一种错误处理方式
names = ['张三','李四'] data = {} try: data['a'] except (KeyError,IndexError) as e: print("Key没有找到,或者下标异常错误:",e)
输出:
Key没有找到,或者下标异常错误: 'a'
【1.4】捕获所有错误(except exception)
这个不常用,因为无法精准定位是什么类型
names = ['张三','李四'] data = {} try: data['a'] except Exception as e: print("出错了:", e)
输出:
出错了: 'a'
【1.5】try except else finally
names = ['张三','李四'] data = {} try: a = 1 except (KeyError,IndexError) as e: print("Key没有找到,或者下标异常错误:",e) except IndexError as e: print("List 操作错误",e) except Exception as e: print("未知错误",e) else: print("如果没有异常发生,那么会执行我这个else,一切正常") finally: print("不管报不报错,我这个finally 还是要执行的")
【2】常用异常类型
- AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
- IOError 输入/输出异常;基本上是无法打开文件
- ImportError 无法引入模块或包;基本上是路径问题或名称错误
- IndentationError 语法错误(的子类) ;代码没有正确对齐(意思就是换行,空格,或者没有顶格,或者缩进等问题)
- IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
- KeyError 试图访问字典里不存在的键
- KeyboardInterrupt Ctrl+C被按下
- NameError 使用一个还未被赋予对象的变量
- SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
- TypeError 传入对象类型与要求的不符合
- UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
- ValueError 传入一个调用者不期望的值,即使值的类型是正确的
【3】自定义错误抛出 raise
class DiyException(Exception): def __init__(self, msg): self.msg = msg def __str__(self): # 这个方法可以不写,详情见下面分析 return self.msg try: raise DiyException("我的Diy异常!") except DiyException as e: print("异常错误信息为:", e)
输出:
异常错误信息为: 我的Diy异常!
分析:
我们这里可以看到有一个 __str__ 函数,他的作用是,但打印该类的时候,就返回它中 return 的值
如果没有写这个函数,那么则以元组形式,返回所有 __init__ 里面的输入入参,如果只有一个参数则输出形式为字符串,如下图
如果写了个和系统错误类别一样的自定义错误类,那么则会覆盖