2023年11月29日发(作者:)

python异常处理机制

python提供了两个⾮常重要的功能来处理python程序在运⾏中出现的异常和错误。你可以使⽤该功能来调试python程序。

异常处理:

断⾔(Assertions)

python标准异常

异常名称描述

BaseException所有异常的基类

SystemExit解释器请求退出

KeyboardInterrupt⽤户中断执⾏(通常是输⼊^C)

Exception常规错误的基类

StopIteration迭代器没有更多的值

GeneratorExit⽣成器(generator)发⽣异常来通知退出

StandardError所有的内建标准异常的基类

ArithmeticError所有数值计算错误的基类

FloatingPointError浮点计算错误

OverflowError数值运算超出最⼤限制

ZeroDivisionError(或取模) (所有数据类型)

AssertionError断⾔语句失败

AttributeError对象没有这个属性

EOFError没有内建输⼊,到达EOF 标记

EnvironmentError操作系统错误的基类

IOError输⼊/输出操作失败

OSError操作系统错误

WindowsError系统调⽤失败

ImportError导⼊模块/对象失败

LookupError⽆效数据查询的基类

IndexError序列中没有此索引(index)

KeyError映射中没有这个键

MemoryError内存溢出错误(对于Python 解释器不是致命的)

NameError未声明/初始化对象 (没有属性)

UnboundLocalError访问未初始化的本地变量

ReferenceError弱引⽤(Weak reference)试图访问已经垃圾回收了的对象

RuntimeError⼀般的运⾏时错误

NotImplementedError尚未实现的⽅法

SyntaxErrorPython 语法错误

IndentationError缩进错误

TabErrorTab 和空格混⽤

SystemError⼀般的解释器系统错误

TypeError对类型⽆效的操作

ValueError传⼊⽆效的参数

UnicodeErrorUnicode 相关的错误

UnicodeDecodeErrorUnicode 解码时的错误

UnicodeEncodeErrorUnicode 编码时错误

UnicodeTranslateErrorUnicode 转换时错误

Warning警告的基类

DeprecationWarning关于被弃⽤的特征的警告

FutureWarning关于构造将来语义会有改变的警告

OverflowWarning旧的关于⾃动提升为长整型(long)的警告

RuntimeWarning可疑的运⾏时⾏为(runtime behavior)的警告

SyntaxWarning可疑的语法的警告

UserWarning⽤户代码⽣成的警告

PendingDeprecationWarning关于特性将会被废弃的警告

⼀、什么是异常?

异常即是⼀个事件,该事件会在程序执⾏过程中发⽣,影响了程序的正常执⾏。

⼀般情况下,在Python⽆法正常处理程序时就会发⽣⼀个异常。

异常是Python对象,表⽰⼀个错误。

Python脚本发⽣异常时我们需要捕获处理它,否则程序会终⽌执⾏。

⼆、异常处理

捕捉异常可以使⽤try/except语句。

try/except语句⽤来检测try语句块中的错误,从⽽让except语句捕获异常信息并处理。

try:

<语句> #运⾏别的代码

except <名字>

<语句> #如果在try部份引发了'name'异常

except <名字><数据>:

<语句> #如果引发了'name'异常,获得附加的数据

else:

<语句> #如果没有异常发⽣

try的⼯作原理是,当开始⼀个try语句后,python就在当前程序的上下⽂中作标记,这样当异常出现时就可以回到这⾥,try⼦句先执⾏,接下来会发⽣什么依赖于执⾏时是否出现

异常。

如果当try后的语句执⾏时发⽣异常,python就跳回到try并执⾏第⼀个匹配该异常的except⼦句,异常处理完毕,控制流就通过整个try语句(除⾮在处理异常时⼜引发新的异常)。

如果在try后的语句⾥发⽣了异常,却没有匹配的except⼦句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息)。

如果在try⼦句执⾏时没有发⽣异常,python将执⾏else语句后的语句(如果有else的话),然后控制流通过整个try语句。

1.使⽤except⽽带多种异常类型

你也可以使⽤相同的except语句来处理多个异常信息,如下所⽰:

try:

正常的操作

......................

except(Exception1[, Exception2[,...ExceptionN]]]):

发⽣以上多个异常中的⼀个,执⾏这块代码

......................

else:

如果没有异常执⾏这块代码

2.使⽤except处理所有异常类型

try:

正常的操作

......................

exceptException as e:

发⽣以上多个异常中的⼀个,执⾏这块代码

......................

else:

如果没有异常执⾏这块代码

-finally 语句

try:

<语句>

finally:

<语句> #退出try时总会执⾏

raise

4.异常的参数

⼀个异常可以带上参数,可作为输出的异常信息参数。

你可以通过except语句来捕获异常的参数,如下所⽰:

try:

正常的操作

......................

except ExceptionType, Argument:

你可以在这输出 Argument 的值...

变量接收的异常值通常包含在异常的语句中。在元组的表单中变量可以接收⼀个或者多个值。

元组通常包含错误字符串,错误数字,错误位置

5.触发异常

我们可以使⽤raise语句⾃⼰触发异常

raise语法格式如下:

raise [Exception [, args [, traceback]]]

语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任⼀种,args 是⾃已提供的异常参数。

最后⼀个参数是可选的(在实践中很少使⽤),如果存在,是跟踪异常对象。

6.⾃定义异常

通过创建⼀个新的异常类,程序可以命名它们⾃⼰的异常。异常应该是典型的继承⾃Exception类,通过直接或间接的⽅式。

以下为与RuntimeError相关的实例,实例中创建了⼀个类,基类为RuntimeError,⽤于在异常触发时输出更多的信息。

try语句块中,⽤户⾃定义的异常后执⾏except块语句,变量 e 是⽤于创建Networkerror类的实例。

class Networkerror(RuntimeError):

def __init__(self, arg):

= arg

在你定义以上类后,你可以触发该异常,如下所⽰:

try:

raise Networkerror("Bad hostname")

except Networkerror,e:

print

两个特殊的处理异常的⽅法

断⾔(assert

assert expression[,reason]

其中assert是断⾔的关键字。执⾏该语句的时候,先判断表达式expression,如果表达式为真,则什么都不做;如果表达式不为真,则抛出异常。reason跟之前谈到的异常类的

实例⼀样。

上下⽂管理(with语句)

如果你使⽤try, except, finally代码仅仅是为了保证共享资源(如⽂件,数据)的唯⼀分配,并在任务结束后释放它,那么这个with语句可以让你从try, except, finally中解放出来!语法如下:

with context_expr [as var]:

with_suite

举个例⼦:

>>> with open('/root/') as f:

... for line in f:

... print line

使⽤with语句来使⽤这些共享资源,我们不⽤担⼼会因为某种原因⽽没有释放他。但并不是所有的对象都可以使⽤with语句,只有⽀持上下⽂管理协议(context management

protocol)的对象才可以,那哪些对象⽀持该协议呢?如下表:

file

t

pe

ion

ore

dSemaphore

sys模块获取异常

另⼀种获取异常信息的途径是通过sys模块中的exc_info()函数。该函数回返回⼀个三元组:(异常类,异常类的实例,跟中记录对象)

>>> try:

... 1/0

... except:

... import sys

... tuple = _info()

...

>>> print tuple

(, ZeroDivisionError('integer division or modulo by zero',), )

>>> for i in tuple:

... print i

...

#异常类

integer division or modulo by zero #异常类的实例

#跟踪记录对象