更新ing
常见的报错类型和简析、异常处理、其他类型的报错(异常)类型简介、自定义异常
常见的报错类型和简析:
报错类型 | 报错内容 | 错误类型判断 | 错误解决方式 |
AttributeError | 属性错误:常见于试图访问一个对象没有 |
程序尝试访问的对象没有对应的属性,查看属性是否存在 | |
AttributeError | AttributeError: module '×××' has no attribute '×××' | 属性错误:调用的模块没有指定的属性 | 如果是调用的标准模块或者第三方模块,确认是否出现自定义文件或目录与其重名 |
AssertionError | 断言错误 | assert 断言语句不符合条件下时会抛出此异常 | |
ArgumentError | sqlalchemy.exc.ArgumentError: Mapper mapped class ***->*** could not assemble any primary key columns for mapped table '***' | 争议异常:sqlalchemy在寻址数据表时,没找到匹配的主键 | 检查主键指定是否有误,或者格式是否正确 |
BrokenPipeError | BrokenPipeError: [Errno 32] Broken pipe | 链接断开 | 核实建立的链接状态,可能服务端在发送时,使用的发送对象是链接对象(socket)而不是交互对象(conn或request等) |
ConnectionError | redis.exceptions.ConnectionError: Error 10061 connecting to localhost:6379. 由于目标计算机积极拒绝,无法连接 | 链接异常:redis服务器断开。 | 检查redis服务端是否关闭,重启 |
ConnectionResetError | ConnectionResetError: [Errno 104] Connection reset by peer | 链接异常:客户端请求过于频繁 | |
ConnectionResetError | ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。 | 链接异常:客户端强制关闭。python3.x中,当客户端强制关闭时,widows系统的服务端不再收取空数据,而是直接报错。linux系统会陷入接收空数据的死循环 | 可用try……进行异常捕捉和处理 |
ConnectionRefusedError | ConnectionRefusedError: [Errno 111] Connection refused | 链接异常,链接无法建立 | 检查服务端是否运行并提供服务 |
ConnectionRefusedError | ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 | 链接异常:服务器积极拒绝请求 | 服务器端接入数量达到上限 |
|
|
||
IndentationError | IndentationError:unexpected indent | 缩进格式错误:意外缩进 | 检查缩进、空格 |
IndentationError | IndentationError:unindent does not match any outer indentation level | 格式错误:缩进方式不一致,有的用空格(数量是否一致),有的用Tab | 调整对应内容的缩进,一致(4空格) |
IndentationError | IndentationError:expected an indented block | 格式错误:出现了不应该有的额空格 | |
IndexError | IndexError:list index out of range | 索引错误:索引超出范围 | 尝试访问序列时,索引超出定义的范围 |
IoError | 输入/输出异常:常见于是无法打开文件 |
核实访问对象的路径和名称 | |
KeyError | 键值错误:试图访问字典里不存在的键 |
||
KeyboardInterrupt | 键盘输入异常 | ||
NameError | 名字错误:常见于使用一个还未被赋予对象的变量 |
||
NameError | NameError: free variable **** referenced before assignment in enclosing scope | 名字错误:自由变量在封闭代码块中,调用前未进行初始化或完成指定 | |
NameError | NameError: name *** is not defined | 名字错误:使用前未定义 | 检查变量是否已经定义,命名格式是否正确 |
RecursionError | RecursionError: maximum recursion depth exceeded in comparison | 递归超过了最大的深度。 | 1000 |
RecursionError | RecursionError: maximum recursion depth exceeded | 递归超过了最大深度 | |
RuntimeError | RuntimeError: dictionary changed size during iteration | 运行期间异常:字典在遍历过程中发生了变动 | 原则上,对于可变数据类型,在遍历过程中,不能直接对元素进行操作,否则会导致遍历退出病报错。 可以转为对字典key值遍历,而不是对其对象直接遍历,for i in dict1.keys() |
SyntaxError | SyntaxError:invalid syntax | 语法错误:无效语法 | |
SyntaxError | SyntaxError: non-default argument follows default argument | 语法错误:非默认参数跟随默认参数,此类错误出现在默认参数后面跟着其他关键参数 | 调整关键参数的位置,至默认参数前 |
SyntaxError | SyntaxError: positional argument follows keyword argument | 语法错误:关键参数后面跟着位置参数,即在键值对参数后面出现了基本数据类型参数 | 调整形参,或者调整传递实参的顺序 |
SyntaxError | SyntaxError: no binding for nonlocal '****' found | 语法错误:在上一层函数中未找到指定的变量 | |
SyntaxError | SyntaxError: unexpected EOF while parsing | 语法错误:语法分析过程遇到意外eof | 如果程序中有eval(),看是否对空值进行了处理 |
TypeError | TypeError: ***** missing 1 required positional argument: “@@” | 类型错误:****需要1个位置参数,但没给 | 传入的数据类型与要求的不符 |
TypeError | TypeError: not all arguments converted during string formatting | 类型错误:在格式化输出过程中前后% 参数不对应 | 查看参数数量、类型等是否对应 |
TypeError | TypeError: __init__() missing 1 required positional argument: 'on_delete' | 类型错误: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错 | on_delete常用值有 models.CASCADE:此值设置,是级联删除。 models.PROTECT:此值设置,是会报完整性错误。 models.SET_NULL:此值设置,会把外键设置为null,前提是允许为null。 models.SET_DEFAULT:此值设置,会把设置为外键的默认值。 models.SET():此值设置,会调用外面的值,可以是一个函数。 一般情况下使用models.CASCADE。 |
TypeError | TypeError: 'type' object is not subscriptable | 类型错误:操作对象不支持下标访问 | 检查对象是否引用正确,对象名字拼写是否正确 |
TypeError | TypeError: 'NoneType' object is not callable | 类型错误:“nonetype”对象不可调用 | |
|
常见于:试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, |
||
UnboundLocalError | UnboundLocalError: local variable '****' referenced before assignment |
未指定造成的局部错误:局部变量在被使用前未初始化或未给予相应指定。 |
|
ValueError | 常见于:传入一个调用者不期望的值,即使值的类型是正确的 |
||
ValueError | ValueError: invalid literal for int() with base 10 | ||
ValueError | ValueError: Sample larger than population or is negative | sample所随机选取的内容数量,大于选择的范围 | 核实带选择的范围是否能完全包住要选择的数量 |
OSError | OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。 | 没有建立正确的链接,套接字引用出错 | |
OSError | OSError: [Error 48] Address in use | 链接地址异常:端口正在被使用 | |
程序中的错误可以大致分为语法错误和逻辑错误两大类。语法错误是指,编写的程序违反了python的基本语法规则,这样的错误会在解析过程中,直接报错。逻辑错误,则是整个程序的设计错误。
异常处理:
如果错误发生的条件是可以预知的,最好是用if 条件进行处理,尽量不用异常处理。这主要是因为异常处理会严重影响程序整体的可读性。
当程序发成的错误条件是不可知的,则可以通过添加异常处理机制。
执行异常处理的目的:捕捉程序整体的运行错误信息,按指定的方式进行处理,可以避免捕捉到的异常影响程序的整体运行。
程序运行报错的信息,可以分为异常寻址信息,异常类型和具体的异常信息,三部分内容。
基本格式:
- (在python2.x中,except语句格式,“except “错误类型” ,e:”;在python3.x中,except语句格式,“except “错误类型” as e:”)
- 可以用 raise 异常类型('异常具体信息') 进行主动异常出发,阻断程序的进一步执行。
常见用法:
- 多分支处理。利用except 列出每一种可以预知的异常类型,并给出相应的处理。
- 利用 except Exception 可以捕捉到所有类型的异常,颗粒度较大。
- else 之后跟的语句,是没有发生异常的情况下执行的语句
- filnally 之后的语句,是无论被检测的代码块是否出现异常,都会执行的语句。通常可用于资源回收
1 # 异常处理的基本语法格式 2 try: 3 """ 4 执行代码块 5 """ 6 7 except “错误类型”as e: # 错误类型可以是单一的,可以是多个,当参数是exception时,抓住所有的错误类型,统一处理一般放在最后抓剩余的未知错误类型 8 9 """ 10 处理对应异常的代码块,e是具体的错误信息 11 """ 12 else: 13 """ 14 当一切正常执行,无错误时,执行的代码块 15 """ 16 finally: 17 """ 18 不管整体是否出错,都会执行此代码块 19 """
断言assert简单介绍:
- 执行目的:断定语法应该是……类型
- 基本语法 assert 判断条件
- 返回的是布尔值,可以和if 判断结合使用。
其他类型的报错(异常)类型简介:
自定义异常:
在系统异常之外,自定义的异常可以协助我们铺捉到代码逻辑异常之外的业务逻辑异常。自定义异常继承自系统异常,一般情况下,自定义异常虽然能对系统异常进行重写,但一般情况下不建议,所以,一般情况下自定义异常命名不能用系统异常的名字。
1 # -------------自定义异常--------------- 2 class MyException(BaseException): # 继承异常的基类 BaseException 3 def __init__(self,msg): 4 super(MyException,self).__init__() # 继承父类的初始化信息 5 self.msg = msg # 重写自定义的信息 6 def __str__(self): # 定义异常的打印格式 7 re_msg = '< %s >' % self.msg 8 return re_msg 9 10 raise MyException # 主动触发异常,本质上完成两个动作,一、阻断程序运行并捕捉异常信息;二、打印异常信息