python3之错误和异常

一、语法错误

程序运行过程出现的错误,包括语法上的错误和执行上的错误(通常是异常)

语法错误又称解析错误,可能是在学习Python时最容易遇到的错误
Python解析器会打印出错误的行,并在错误行中错误位置显示一个下标箭头

二、异常

语句或表达式在语法上是正确的,执行时引发错误称为异常
异常不一定会导致严重后果,大多数的异常都不会被程序处理,程序终止并显示异常错误信息

1 内置异常层次结构

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

2 基类内置异常

BaseException
所有内置异常的基类,不能被用户定义的异常直接继承

Exception
所有内置的非系统退出异常都派生自此类,所有用户定义的异常也应从此类派生

ArithmeticError
所有算术类错误而引发的内置异常都派生自此类: OverflowError, ZeroDivisionError, FloatingPointError

BufferError
与缓冲区相关的操作无法执行时将被引发

LookupError
用于派生当映射或序列所使用的键或索引无效时引发的异常: IndexError, KeyError

3 常用的具体内置异常

AssertionError
assert语句条件为False时引发

AttributeError
属性引用或赋值失败时引发

EOFError
当input()函数达到文件结束条件(EOF)而没有读取任何数据时引发

ImportError
当import语句导入模块失败时引发

ModuleNotFoundError
找不到模块时引发

IndexError 
序列索引超出范围时引发

KeyError
找不到key时引发

KeyboardInterrupt
用户按下中断键(通常为Control-C或 Delete)时引发

MemoryError
内存不足时引发

NameError
使用未声明的变量时引发 

StopIteration
内置函数next()和迭代器的 __next__()方法,迭代器迭代完引发

SyntaxError
语法错误时引发

TabError
缩进混合使用空格和制表符时引发

TypeError
参数类型不支持当前操作时引发

ValueError
参数类型正确但值不合适时引发,即参数值无效

ZeroDivisionError
分母为0时引发

4 OSError异常的子类

BlockingIOError
将堵塞对象设置为费堵塞时引发

ChildProcessError
子进程上的操作失败时引发

ConnectionError
连接相关问题的基类

BrokenPipeError
ConnectionError的子类,在已关闭写入的套接字上写入

ConnectionAbortedError
ConnectionError的子类,连接尝试被对等方中止

ConnectionRefusedError
ConnectionError的子类,连接尝试被对等方拒绝

ConnectionResetError
ConnectionError的子类,连接由对等方重置

FileExistsError
创建文件或目录已存在时引发

FileNotFoundError
请求文件或目录不存在时引发

InterruptedError
系统调用被输入信号中断时引发

IsADirectoryError
在目录上请求文件操作时引发

NotADirectoryError
在非目录上请求目录操作时引发

PermissionError
没有访问权限时引发

ProcessLookupError
进程不存在时引发

TimeoutError
系统函数在系统级别超时时引发

三、异常捕捉处理

1 try...except

格式

try:
    代码块
except 内置异常类型1:
    发生异常时执行的代码块
except 内置异常类型2:
    发生异常时执行的代码块    
...

except Exception:
     ...

其中
一个try语句可以有多个except语句,多个except语句处理不同的异常类型,但最多只会执行一个except语句
except后面异常类型可以有多个,以逗号隔开,如except (ValueError,IndexError.ArithmeticError)
多个except语句捕捉异常时的顺序: 应按子类异常在前,父类异常在后,即先小异常后大异常

示例

ef divisi_1(a,b):
    return int(a)/int(b)

try:
    print(divisi_1('2',2))
    #引发ValueError错误
    print(divisi_1('A',2))
except ValueError:
    print("参数值无效,数学运算只接受数字")
except ArithmeticError:
    print("算数错误")
except Exception:
    print("未知错误")


def divisi_2(a,b):
    return int(a)/int(b)

try:
    print(divisi_2('2',2))
    #引发ArithmeticError错误
    print(divisi_2(2,0))
except ValueError:
    print("参数值无效,数学运算只接受数字")
except ArithmeticError:
    print("算数错误")
except Exception:
    print("未知错误")

2 else块

当try块执行未出现异常时执行,else块可选

示例

def divisi(a,b):
    return int(a)/int(b)

try:
    print(divisi('2',2))
except ValueError:
    print("参数值无效,数学运算只接受数字")
except ArithmeticError:
    print("算数错误")
except Exception:
    print("未知错误")   
else:
    print("try块未引发任何异常")  

3 finally块

无论是否发生异常都被执行,常用于清理操作

以下情况需要注意

A.如果try块的异常没有被except块捕获,则该异常会在finally块执行之后被重新引发
B.如果except或else块引发异常, 则该异常会在finally块执行之后被重新引发
C.如果try块时有 break, continuereturn 语句,则finally块将在执行 break, continuereturn 语句之前被执行
D.如果 finally 子句中包含一个 return 语句,则返回值将来自 finally 块的某个 return 语句的返回值,而非来自其它块的 return 语句返回值

示例

def divisi(a,b):
    return int(a)/int(b)

try:
    #引发ValueError错误
    print(divisi('A',2))
except ValueError:
    print("参数值无效,数学运算只接受数字")
except ArithmeticError:
    print("算数错误")
except Exception:
    print("未知错误")   
else:
    print("try块未引发任何异常") 
finally:
    print("始终执行的finally块")

4 完整的异常捕捉处理语法格式

格式

try:
    代码块
except 内置异常类型1:
    发生异常时执行的代码块
except 内置异常类型2:
    发生异常时执行的代码块    
...

except Exception:
     ...
else:
    未发生异常的代码块
finally:
    清理操作代码块


其中
A.try块必须要有
B.except,finally块至少包含一个
C.else块可以没有
D.finally块必须在所有except块之后
E.多个except块,子类异常必须在父类异常之前

四、自行引发异常

除了系统自动引发异常,也可以自行引发异常
python对自行引发的异常和系统自动引发的异常同样的处理

示例

def compare(a,b):
    if a > b:
        raise Exception("a不能大于b,a=%s,b=%s"% (a,b))
    else:
        print("%s>%s"%(b,a))

try:
    compare(5,4)
except Exception as E:
    print(E.args)
    print("自行引发的Exception异常!")
else:
    print("try块未引发任何异常!")
finally:
    print("始终执行的finally块!")
原文地址:https://www.cnblogs.com/gudanaimei/p/13463765.html