Python异常

Python异常
马永亮python视频(56-59讲)笔记

目录

 

Python异常

异常的功能

1、错误处理

2、事件通知

3、特殊情况处理

4、终止行为

5、非常规控制流程

检测和处理异常

自定义异常——raise

python异常对象

Python的标准异常类

自定义异常类

assert语句

(不官方)小结


 

Python异常

python的运行时发生的错误称作异常

这个错误主要有两种类型:

  1. 语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译
  2. 逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑无法生成、计算或者输出结果需要的过程无法执行等

python异常是一个对象,表示错误或意外情况

在python检测到一个错误时,将触发一个异常

  • python可以通过异常传递机制传递一个异常对象,发出一个异常情况出现的信号
  • 程序员也可以在代码中手动触发异常

python异常可以理解为:程序出现了错误而在正常控制流以外采取的行为

  • 第一阶段:解释器触发异常,此时当前程序流将被打断
  • 第二阶段:异常处理,如忽略非致命性错误、减轻错误带来的影响等


## 我们需要对捕获的异常进行处理。如果没有做任何处理的话,这些异常会一直向上向上,直到python解释器,而解释器看到异常就会中止脚本执行,这种情况往往是我们不愿意看到的;
## 所以无论是哪种异常,都应该由程序员事先预想到,或者在程序内部有相关的处理操作;
## 程序员不能任由由于自己没有考虑到一些情况而导致异常发生,或者是用户输入了我们并不期望的数据导致异常发生时,而中止程序;

异常的功能

1、错误处理

  • python的默认处理:停止程序,打印错误消息
  • 使用 try 语句处理异常并从异常中恢复

2、事件通知

用于发出有效状态信号

## 一旦出现异常,就会由解释器触发一个信号通知给程序员;
## 不同的异常有不同的类型,通过这个信号可以了解到,到底在什么位置发生了什么样的错误;

3、特殊情况处理

无法调整代码去处理的场景

4、终止行为

try/finally 语句可确保执行必须的结束处理机制

5、非常规控制流程

异常是一种高级转跳(goto)机制——实现代码中的大跨度跳转

检测和处理异常

异常通过try语句来检测

任何在try语句块里的代码都会被监测,以检查有无异常发生

try语句主要有两种形式:

  1. try-except:检测和处理异常
    try后检测
    except后处理
    可以有多个 except
    支持使用 else 子句处理没有探测异常的执行的代码

  2. try-finally:仅检查异常并做一些必要的清理工作(如关闭文件或断开服务器连接等)
    如果发现异常了,则对异常做一些收尾工作,不对异常本身做处理
    仅能有一个finally
    无论异常发生与否,finally子句都会执行

上述两种形式可以混合:

  • try 语句的复合形式
    try-except-finally

自定义异常——raise

raise语句可显式触发异常
(这是系统上不存在的,我们自行定义的异常)

格式为:

  • raise [SomeException [, args [, traceback] ] ]
    • SomeException:可选,异常的名字,仅能使用字符串、类或实例
    • args:可选,以元组的形式传递给异常的参数
    • traceback:可选,异常触发时新生成的一个用于异常-正常化的跟踪记录,多用于重新引发异常时

python异常对象

python异常是一个对象,是由内置的经典类——Exception类生成的对象,是这个类的子类的实例化

python2.5之后,Exception是从BaseException继承的新式类

也就是说,BaseException是所有异常的基类

大多的标准异常都是由StandarError派生的,其有3个抽象的子类:

  • ArithmeticError:由于算术错误而引发的异常基类
    例如:OverflowError,ZeroDivisionError,FloatingPointError
  • LookupError:容器在接收到一个无效键或索引是引发的异常的基类
    例如:IndexError,KeyError
  • EnvironmentError:由于外部原因而导致的异常的基类
    例如:IOError,OSError,WindowsError

Python的标准异常类

BaseException 是所有异常的基类;
Warning 是警告的基类

python中常用的标准异常类:

(按字母顺序排序)

异常名称 描述
AssertionError 断言语句失败
AttributeError 属性引用或赋值失效,表示对象没有这个属性
FloatingPointError 浮点型运算失败
IOError I/O(输入/输出)操作失败
ImportError import 语句不能找到要导入的模块,或者不能找到该模块特别请求的名称
IndentationError 解析器遇到了一个由于错误的缩进而引发的语法错误
IndexError 用来索引序列的整数超出了范围,序列中没有没有此索引(index)
KeyError 用来索引映射的键不在映射中
KeyboardInterrupt 用户按了中断键(ctrl+c, ctrl+break 或 Delete键)
MemoryError 运算耗尽内存,内存溢出错误(对于Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性),引用了一个不存在的变量名
NotImplementedError 由抽象基类引发的异常,用于指示一个具体的子类必须覆盖一个方法(表示尚未实现的方法)
OSError 由模块os中的函数引发的异常,用来指示平台相关的错误(操作系统错误)
OverflowError 数值运算超出最大限制,溢出
SyntaxError 语法错误
SystemError python本身或某些扩展模块中的内部错误(一般的解释器系统错误)
TypeError 对某对象执行了不支持的操作
UnboundLocalError 引用未绑定值的本地变量(访问未初始化的本地变量)
UnicodeError 在Unicode的字符串之间进行转换时发生的错误
ValueError 值错误,应用于某个对象的操作或函数,这个对象具有正确的类型,但确有不适当的值
WindowsError 模块os中的函数引发的异常,用来指示与Windows相关的错误(系统调用失败)
ZeroDivisionError 除数或取模为0(所有数据类型)

(其他来源)补充:

(按字母顺序排序)

异常名称 描述
ArithmeticError 所有数值计算错误的基类
BaseException 所有异常的基类
DeprecationWarning 关于被弃用的特征的警告
EnvironmentError 操作系统错误的基类
EOFError 没有内建输入,到达EOF 标记
Exception 常规错误的基类
FutureWarning 关于构造将来语义会有改变的警告
GeneratorExit 生成器(generator)发生异常来通知退出
LookupError 无效数据查询的基类
PendingDeprecationWarning 关于特性将会被废弃的警告
ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
StandardError 所有的内建标准异常的基类
StopIteration 迭代器没有更多的值
SyntaxWarning 可疑的语法的警告
SystemExit Python 解释器请求退出
TabError Tab 和空格混用
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
UserWarning 用户代码生成的警告

自定义异常类

自定义异常和多重继承

  • 较有效的方法是从自定义异常类和标准异常类进行多重继承,例如:
class CustomAttributeError(CustomException, AttributeError):
    pass

标准库中使用的其它异常

  • python标准库中的许多模块都定义了自己的异常类,如 socket 中的 socket.error

assert语句

assert 语句用于在程序中引入调试代码

assert condition [, expression ]

  • 如果 condition 条件满足,assert 不做任何操作;
  • 如果 condition 条件不满足,则 assert 使用 expression 作为参数实例化 AssertionError 并引发结果实例

注意如果运行python时使用了 -O 优化选项,则assert将是一个空操作,编译器不为 assert 语句生成代码

  • 运行python时不使用 -O 选项,则 __debug__ 内置变量为 True,否则其值为 False

assert 语句其实就相当于下面的代码:

if __debug__:
    if not condition:
        raise AssertionError, 


## assert 会生成一个自定义的断言异常,
## 说白了就是一个简化版的自定义异常方式,
## 能够实现手动触发异常

(不官方)小结

python异常是一个由类生成的对象

python异常对象有很多种,但是都有一个共同的基类:BaseException

BaseException下面有3个抽象子类

每个抽象类内部有很多子的、常用的、真正的异常类

用户可以手动用 raise 触发异常(自定义异常)

不论哪一种异常都是可以进行捕获的

捕获或处理异常的两种方式:

  • try-except
  • try-finally
  • 两者还可嵌套结合使用

raise 中还有一个特殊的方式:assert 断言,是个简化版的自定义异常的方式

 

--------本文完--------


附录:https://docs.python.org/zh-cn/3.7/library/asyncio-exceptions.html  异常-Python文档

 

 

你可能感兴趣的:(python)