异常定义:
异常就是python 运行时的意料之外的情况,不同于 错误。
错误:可以理解为 算法逻辑写错了,变量名写错了,语法错误等,这些是人为造成的,可以避免的。(python代码会先编译成中间字节码,然后在运行,而语法错误是在编译的过程中发现的。)
异常:意外情况,比如程序访问一个网络文件,而断网了。打开一个文件,但是文件不存在。
异常可以被捕获被处理,而错误是不能被捕获的。
一个健壮的程序,尽可能的避免错误,尽可能的捕获异常,处理各种异常。
异常处理:
try:... expect: ....
捕捉指定类型的异常:
上面的expect: 代表什么异常都捕获,此外还可以指定要捕获的异常。
如果捕获的异常类型不正确是无法捕获的,如下:
常见异常:
注意:Python所有的错误都是从BaseException
类派生的,而 Exception 是BaseException 的子类 包含大部分异常 是 非系统退出的异常的基类。如SystemExit 则不在其中。
- AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
- IOError 输入/输出异常;基本上是无法打开文件
- ImportError 无法引入模块或包;基本上是路径问题或名称错误
- IndentationError 语法错误(的子类) ;代码没有正确对齐
- 这种语法错误或者强类型错误,程序无法捕捉,因为程序在加载到解释器时,解释器会对代码进行结构扫面,这时候扫描到语法错误,会导致程序崩溃。
- IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
- KeyError 试图访问字典里不存在的键
- KeyboardInterrupt Ctrl+C被按下
- 这个异常被抓取后,程序就不会因Ctrl + C 退出
- 同样的还有EOFError , 程序不会因Ctrl + d 退出
- 这两种错误可以放在一起抓取:
- except (EOFError,KeyboardInterrupt) as e:
- python3 中多个异常用括号,2 中不用括号,直接逗号写
- NameError 使用一个还未被赋予对象的变量
- SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
- TypeError 传入对象类型与要求的不符合
- UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
- ValueError 传入一个调用者不期望的值,即使值的类型是正确的
异常匹配过程中,可以多次匹配 expect,如下: 自上而下的匹配。
raise 手动创建一个新的异常,抛出
raise后面如果是一个类本身的话,实际会调用 类的实例化对象, 也就是类()
as子句,将异常信息赋给标识符
自定义异常:
raise抛出的异常,除了python已经定义好的,还可以自定义异常。
这里的自定义异常可以是一个字符,一个列表,集合等,还可以是用一个类,一个实例,如下:
raise可以收到抛出异常,但是抛出的异常必须由对应的异常类型才能接收, 在这里自定义异常 MyException是继承的Exception类, 所以Exception可以接收。
finally: 最后处理
一般在最后做一些资源释放的操作
不管是什么异常,如果异常最后没有被处理掉, 就由finally接收,一般在这里做些资源释放的操作。
else 子句
当没有异常时,try块中的 else 子句才会被执行。
异常总结:
https://www.hugbg.com/archives/2533.html
2020-05-19 3:17 下午 1F
月有盈亏花有开谢,想人生最苦离别。 —普天乐·咏世