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尚未实现的⽅法
SyntaxError Python 语法错误
IndentationError缩进错误
TabError Tab 和空格混⽤
SystemError⼀般的解释器系统错误
TypeError对类型⽆效的操作
ValueError传⼊⽆效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning警告的基类
DeprecationWarning关于被弃⽤的特征的警告
FutureWarning关于构造将来语义会有改变的警告
OverflowWarning旧的关于⾃动提升为长整型(long)的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运⾏时⾏为(runtime behavior)的警告
SyntaxWarning可疑的语法的警告
UserWarning⽤户代码⽣成的警告
⼀、什么是异常?
异常即是⼀个事件,该事件会在程序执⾏过程中发⽣,影响了程序的正常执⾏。
⼀般情况下,在Python⽆法正常处理程序时就会发⽣⼀个异常。
异常是Python对象,表⽰⼀个错误。
当Python脚本发⽣异常时我们需要捕获处理它,否则程序会终⽌执⾏。
⼆、异常处理
捕捉异常可以使⽤try/except语句。
try/except语句⽤来检测try语句块中的错误,从⽽让except语句捕获异常信息并处理。
如果你不想在异常发⽣时结束你的程序,只需在try⾥捕获它。
语法:
以下为简单的lse的语法:
<;语句>        #运⾏别的代码
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处理所有异常类型
python的try和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):
self.args = arg
在你定义以上类后,你可以触发该异常,如下所⽰:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args
两个特殊的处理异常的⽅法
断⾔(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/test.py') as f:
...    for line in f:
...        print line
使⽤with语句来使⽤这些共享资源,我们不⽤担⼼会因为某种原因⽽没有释放他。但并不是所有的对象都可以使⽤with语句,只有⽀持上下⽂管理协议(context management protocol)的对象才可以,那哪些对象⽀持该协议呢?如下表:
file
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore
sys模块获取异常
另⼀种获取异常信息的途径是通过sys模块中的exc_info()函数。该函数回返回⼀个三元组:(异常类,异常类的实例,跟中记录对象)。 
>>> try:
...    1/0
... except:
...    import sys
...    tuple = _info()
...
>>> print tuple
(<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or modulo by zero',), <traceback object at 0x7f538a318b48>)
>>> for i in tuple:
...    print i
...
<type 'exceptions.ZeroDivisionError'> #异常类
integer division or modulo by zero #异常类的实例
<traceback object at 0x7f538a318b48> #跟踪记录对象 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。