Python标准异常和异常处理详解python提供了两个⾮常重要的功能来处理python程序在运⾏中出现的异常和错误。你可以使⽤该功能来调试python程序。
1.异常处理: 本站Python教程会具体介绍。
2.断⾔(Assertions):本站Python教程会具体介绍。
异常名称描述
BaseException所有异常的基类
SystemExit解释器请求退出
KeyboardInterrupt⽤户中断执⾏(通常是输⼊^C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit⽣成器(generator)发⽣异常来通知退出
SystemExit Python 解释器请求退出
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点计算错误
OverflowError数值运算超出最⼤限制
ZeroDivisionError除(或取模)零 (所有数据类型)
AssertionError断⾔语句失败
AttributeError对象没有这个属性
EOFError没有内建输⼊,到达EOF 标记
EnvironmentError操作系统错误的基类
IOError输⼊/输出操作失败
OSError操作系统错误
WindowsError系统调⽤失败
ImportError导⼊模块/对象失败
KeyboardInterrupt⽤户中断执⾏(通常是输⼊^C)
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⾥捕获它。
语法:
以下为简单的try….except…else的语法:
try:
<;语句>      #运⾏别的代码
except <;名字>:
<;语句>      #如果在try部份引发了'name'异常
except <;名字>,<;数据>:
<;语句>      #如果引发了'name'异常,获得附加的数据
else:
<;语句>      #如果没有异常发⽣
try的⼯作原理是,当开始⼀个try语句后,python就在当前程序的上下⽂中作标记,这样当异常出现时就可以回到这⾥,try⼦句先执⾏,接下来会发⽣什么依赖于执⾏时是否出现异常。
1.如果当try后的语句执⾏时发⽣异常,python就跳回到try并执⾏第⼀个匹配该异常的except⼦句,异常处理完毕,控制流就通过整个try语句(除⾮在处理异常时⼜引发新的异常)。
2.如果在try后的语句⾥发⽣了异常,却没有匹配的except⼦句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
3.如果在try⼦句执⾏时没有发⽣异常,python将执⾏else语句后的语句(如果有else的话),然后控制流通过整个try语句。
下⾯是简单的例⼦,它打开⼀个⽂件,在该⽂件中的内容写⼊内容,且并未发⽣异常:
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
fh.close()
以上程序输出结果:
Written content in the file successfully
下⾯是简单的例⼦,它打开⼀个⽂件,在该⽂件中的内容写⼊内容,但⽂件没有写⼊权限,发⽣了异常:
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exceptionhandling!!")
except IOError:
print "Error: can\'t find file or read data"
else:
print "Written content in the file successfully"
以上程序输出结果:
Error: can't find file or read data
你可以不带任何异常类型使⽤except,如下实例:
try:
You do your operations here;
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
以上⽅式try-except语句捕获所有发⽣的异常。但这不是⼀个很好的⽅式,我们不能通过该程序识别出具体的异常信息。因为它捕获所有的异常。你也可以使⽤相同的except语句来处理多个异常信息,如下所⽰:
try:
You do your operations here;
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
try-finally 语句⽆论是否发⽣异常都将执⾏最后的代码。
try:
<;语句>
finally:
<;语句>    #退出try时总会执⾏
raise
注意:你可以使⽤except语句或者finally语句,但是两者不能同时使⽤。else语句也不能与finally语句同时使⽤
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exceptionhandling!!")
finally:
print "Error: can\'t find file or read data"
如果打开的⽂件没有可写权限,输出如下所⽰:
Error: can't find file or read data
同样的例⼦也可以写成如下⽅式:
#!/usr/bin/python
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file forexception handling!!")
finally:
print "Going to close the file"
fh.close()
except IOError:
print "Error: can\'t find file or read data"
当在try块中抛出⼀个异常,⽴即执⾏finally块代码。
finally块中的所有语句执⾏后,异常被再次提出,并执⾏except块代码。
参数的内容不同于异常。
⼀个异常可以带上参数,可作为输出的异常信息参数。
你可以通过except语句来捕获异常的参数,如下所⽰:
try:
You do your operations here;
......................
except ExceptionType, Argument:
You can print value of
变量接收的异常值通常包含在异常的语句中。在元组的表单中变量可以接收⼀个或者多个值。
元组通常包含错误字符串,错误数字,错误位置。
实例
以下为单个异常的实例:
#!/usr/bin/python
# Define afunction here.
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "The argument does not contain numbers\n",Argument
# Call abovefunction here.
temp_convert("xyz");
以上程序执⾏结果如下:
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
触发异常
我们可以使⽤raise语句⾃⼰触发异常
raise语法格式如下:
raise [Exception [, args [, traceback]]]
语句中Exception是异常的类型(例如,NameError)参数是⼀个异常参数值。该参数是可选的,如果不提供,异常的参数是”None”。最后⼀个参数是可选的(在实践中很少使⽤),如果存在,是跟踪异常对象。
实例
⼀个异常可以是⼀个字符串,类或对象。 Python的内核提供的异常,⼤多数都是实例化的类,这是⼀个类的实例的参数。
unicode keyboard download定义⼀个异常⾮常简单,如下所⽰:
def functionName( level ):
if level < 1:
raise "Invalid level!", level
# The code below to this would not be executed
# if we raise the exception
注意:为了能够捕获异常,”except”语句必须有⽤相同的异常来抛出类对象或者字符串。
例如我们捕获以上异常,”except”语句如下所⽰:
try:
Business
except "Invalid level!":
Exception
else:
Rest of the
通过创建⼀个新的异常类,程序可以命名它们⾃⼰的异常。异常应该是典型的继承⾃Exception类,通过直接或间接的⽅式。以下为与RuntimeError相关的实例,实例中创建了⼀个类,基类为RuntimeError,⽤于在异常触发时输出更多的信息。
在try语句块中,⽤户⾃定义的异常后执⾏except块语句,变量 e 是⽤于创建Networkerror类的实例。
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
在你定义以上类后,你可以触发该异常,如下所⽰:
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args
==================================================================================== Python标准异常总结
AssertionError断⾔语句(assert)失败
AttributeError尝试访问未知的对象属性
EOFError⽤户输⼊⽂件末尾标志EOF(Ctrl+d)
FloatingPointError浮点计算错误
GeneratorExit generator.close()⽅法被调⽤的时候
ImportError导⼊模块失败的时候
IndexError索引超出序列的范围
KeyError字典中查⼀个不存在的关键字
KeyboardInterrupt⽤户输⼊中断键(Ctrl+c)
MemoryError内存溢出(可通过删除对象释放内存)
NameError尝试访问⼀个不存在的变量
NotImplementedError尚未实现的⽅法
OSError操作系统产⽣的异常(例如打开⼀个不存在的⽂件)
OverflowError数值运算超出最⼤限制
ReferenceError弱引⽤(weak reference)试图访问⼀个已经被垃圾回
收机制回收了的对象
RuntimeError⼀般的运⾏时错误
StopIteration迭代器没有更多的值
SyntaxError Python的语法错误
IndentationError缩进错误
TabError Tab和空格混合使⽤
SystemError Python编译器系统错误