1.  
  2. 主页
  3.  / 
  4. Python基础到高级
  5.  / 
  6. 异常处理

异常处理

什么是异常?

异常就是不正常的,按照设计:程序会按照流程走完,但是这个流程会存在各种意外,每个意外都称之为异常

异常在平时的开发中是不可避免的,并且异常并不能称之为错误

错误是不可以捕获处理的,但是异常是可以捕获处理的

例如当找不到需要操作的文件的时候,那么这个意外就是异常

出现解释器无法解析的指令的时候,那么这个意外就是错误,这样的错误我们是无法捕获处理的

抛出异常

异常是不可能凭空出现的,肯定是程序抛出的

python中使用raise抛出一个异常,当异常抛出的时候,程序会提前返回

捕获异常

在所有的高级编程语言中都是存在一种try…except…finally…的错误处理机制的,python也不例外。

在python中异常处理的代码格式是这样的

举一个没有 finally的例子

在我们日常的开发中经常会遇到各种各样的异常,比较常见的例如有:TypeError, IndexError, ValueError, KeyError等等,其实这些异常都是继承自一个 Exception 的类,通过 __mro__ 来查询父类

既然是捕获异常那么,就可以根据抓取到是什么异常,然后来执行对应的代码块,处理不同的操作

except后面可以跟一个异常类,这时候,它仅仅捕获此类及子类的异常

有的时候,在开发过程中,语言内置的异常无法满足我们的需求的时候,我们就需要自己来创建异常,既然所有的异常都是继承自Exception的那么,我们自己来写一个类继承自Exception的话,就是我们自己创建的异常了

一个try语句,可以带多个except语句,当程序在当前解释器中出现多个异常的时候,就可以用多个except来进行异常捕获

多个except子句的话,匹配方式是从上到下匹配的,因此越具体的异常类应该越放到前面,越一般的异常类应该越放到后面

当前面捕获的异常类是 Exception 的时候,就不会在继续执行下面的except字句了

raise抛出的是异常类的实例,因此except可以使用as的子句,获取异常类的实例

在异常处理的时候,可以给异常处理的代码传递一些信息

异常的层级

在python的标准库中,只有四个异常是直接继承自BaseException的,通常来说自定义异常是不会直接继承BaseException的

标准库的其他异常都直接或者间接的继承自Exception,所以自定义异常也应该直接或者间接的继承自Exception

finally

try语句可以带finally子句,无论是否发生异常,finally子句都会执行的

即使抛出异常没有被except捕获,finally语句块依然会执行

因为finally的特性,所以一般资源清理的工作都交给finally处理

另外,在Python中整个try语句就是一个作用域,因此try子句之间的成员是共享的

finallyh是在函数返回之前执行的

异常的传递

当抛出异常时,如果没有捕获处理,会继续传递到上层作用域,知道最顶层,如果到最顶层还是没有捕获处理,则中断当前线程

异常时具有可传递性的

这篇文章对您有用吗?

我们要如何帮助您?

发表评论

邮箱地址不会被公开。 必填项已用*标注