Python异常

来源:互联网 发布:mac pro强制重启 编辑:程序博客网 时间:2024/06/03 21:33

Python异常

在学习python的过程中,感觉是一门特别容易出错的脚本程序语言,不像C/C++java在编译的过程中对于语法会有各种检查,尤其是数据类型等,但是在python中,一个变量是可以指向任何类型的,要是编程习惯不好,一不小心就可能造成一些不属于该变量类型的操作,从而引起程序终止。同时,在做一些操作时,例如文件打开等,也可能不成功引发异常等,这个和其他语言一样必须要有异常处理机制。在python中,通过try...except...finally...来进行异常处理。

 其中try后面跟的代码块是我们需要执行的正常代码,当try中的代码执行出现异常的时候,会跳转到excepttry代码块中的代码就不会再执行,若是正常执行,那么就正常的执行代码。出现异常,执行完except后,如果有finally语句块,则执行finally语句块,然后程序按照正常流程走。若是没有错误发生,所以except语句块不会被执行,但是finally如果有,则一定会被执行。一个python异常处理中可以有多个exceptexcept可以对不同的异常进行分类,从而实现不同的异常处理代码,其用法与C++中的switch case相似,如果没有错误发生,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句。

如下代码:

a=0
try:
    print
"trying........"
    result=10/a
    print"result:%d"%result
exceptZeroDivisionError:
    print
"Zero Division Error"
else:
    print
"No Zero Division Error"
finally:
    print
"finally runing"

a=0的时候,其结果打印如下:

trying........

Zero Division Error

finally runing

a=1的时候,器结果打印如下:

trying........

result:10

No Zero Division Error

finally runing

 

对于产生异常的结果实例保存,可以在except语句的:前添加as变量,变量

例如:

exceptZeroDivisionErrorase:

exceptZeroDivisionError, e:

在上述代码的代码修改如下:

exceptZeroDivisionError, e:
    print
e.__doc__
    print"Zero Division Error"

其结果如下:

trying........

Second argument to a division or modulo operation was zero.

Zero Division Error

finally runing

 

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的异常是class,所有的错误类型都继承自BaseException,其具体的继承关系如下图:

当然,当你捕获一个异常的时候,其子类的异常也会被捕获。python用户自己定义异常,例如如下,定义MyErron,继承BaseException,定义errorFunction函数,通过raise产生MyErron异常。在try.....except中,try代码块调用errorFunction函数,except捕获该异常。代码如下:

classMyErron(BaseException):
    pass

deferrorFunction
():
    raise
MyErron()
    return

try:
    
errorFunction()
    pass
except
MyErron:
    print
"<<<<My Error>>>>>"
else:
    print
"Np Error"
finally:
    print
"finally"

 

代码执行结果为:

My Error

Finally

 

try...except捕获可以跨越多层调用,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了,如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。这就是为啥在以前写的没有异常处理的代码为何在遇到错误就会报错退出。其跨层调用实例如下,在第三层function产生的异常,在main函数执行的过程中进行捕获。

deffunction():
    
a=10/0
    return

deffunction1
():
    
function()
    return

defmain
():
    
function1()
    return

try:
    
main()
exceptZeroDivisionErrorase:
    print
"Error"
    printe.message

其结果如下:

Error

integer division or modulo by zero

原创粉丝点击