python基础教程(第3版)笔记-第八章

一般情况编写计算机程序时,异常事件可能是错误,也可能是通常不会发生的事情。为处理这些异常事件,可在每个可能发生这些事件的地方使用条件语句。当然还有更好的解决方案——异常处理机制。

8.1什么是异常

python使用异常对象来表示异常状态,并在遇到错误时引发异常。异常对象未被处理(或捕获)时,程序将终止并显示一条错误消息(traceback)
python基础教程(第3版)笔记-第八章_第1张图片
如果异常只能用来显示错误消息,就没多大意思了。但事实上,每个异常都是某个类(这里
是ZeroDivisionError)的实例。你能以各种方式引发和捕获这些实例,从而逮住错误并采取措施,
而不是放任整个程序失败

8.2自主引发异常

raise语句

要引发异常,可使用raise语句,并将一个类(必须是EXception的子类)或实例作为参数。将类作为参数时,将自动创建一个实例。下面的案例使用的是内置异常类Exception:
python基础教程(第3版)笔记-第八章_第2张图片
一些内置的异常类

类名 描述
Exception 几乎所有的异常类都是从它派生而来的
AttributeError 引用属性或给它赋值失败时引发
OSError 操作系统不能执行指定的任务(如打开文件)时引发,有多个子类
IndexError 使用序列中不存在的索引时引发,为LookupError的子类
KeyError 使用映射中不存在的键时引发,为LookupError的子类
NameErro 找不到名称(变量)时引发
SyntaxError 代码不正确时引发
TypeErro 内置操作或函数用于类型不正确的对象时引发
ValueError 将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适
ZeroDivisionError 在除法或求模运算的第二个参数为零时引发
捕获异常

为捕获异常并对错误进行处理,可以像下面这样重写这个程序:
try/except的话只需要一个错误处理程序。
python基础教程(第3版)笔记-第八章_第3张图片

多个except子句

为同时捕获这种异常,可在try/except语句中再添加一个except子句python基础教程(第3版)笔记-第八章_第4张图片

捕获对象

要在except子句中访问异常对象本身,可使用两个而不是一个参数。(请注意,即便是在你捕获多个异常时,也只向except提供了一个参数——一个元组。)需要让程序继续运行并记录错误(可能只是向用户显示)时,这很有用。下面的示例程序打印发生的异常并继续运行
python基础教程(第3版)笔记-第八章_第5张图片
要使用一段代码捕获所有的异常,只需在except语句中不指定任何异常类即可。
python基础教程(第3版)笔记-第八章_第6张图片

不那么异常的情况

如果你只想发出一些警告,指出情况偏离了正轨,可使用模块warnings中的函数warn。
python基础教程(第3版)笔记-第八章_第7张图片
注意:警告只显示一次。如果再次运行最后一行代码,什么事情都不会发生。

本章小结

  1. 异常对象:异常情况(如发生错误)是用异常对象表示的。对于异常情况,有多重处理方式;如果忽略,将导致程序终止。
  2. **引发异常:**可使用raise语句来引发异常。它将一个异常类或异常实例作为参数,但你也可提供两个参数(异常和错误消息)。如果在except子句中调用raise时没有提供任何参数,它将重新引发该子句捕获的异常。
  3. **自定义的异常类:**你可通过从Exception派生来创建自定义的异常。
  4. **捕获异常:**要捕获异常,可在try语句中使用except子句。在except子句中,如果没有指定异常类,将捕获所有的异常。你可指定多个异常类,方法是将它们放在元组中。如果向except提供两个参数,第二个参数将关联到异常对象。在同一条try/except语句中,可
    包含多个except子句,以便对不同的异常采取不同的措施。
  5. ** else子句:**除except子句外,你还可使用else子句,它在主try块没有引发异常时执行。
  6. ** finally:**要确保代码块(如清理代码)无论是否引发异常都将执行,可使用try/finally,并将代码块放在finally子句中。
  7. **异常和函数:**在函数中引发异常时,异常将传播到调用函数的地方(对方法来说亦如此)
  8. **警告:**警告类似于异常,但(通常)只打印一条错误消息。你可指定警告类别,它们是Warning的子类。

本章介绍的新函数

函数 描述
warnings.filterwarnings(action,category=Warning, …) 用于过滤警告
warnings.warn(message, category=None) 用于发出警告

你可能感兴趣的:(python学习)