摘要
本文部分内容来源于网络,个人收集整理,请勿传播
在写python程序过程中,难免会遇到各种各样的异常和错误。而我们可以用下面的语句来捕捉到错误并进行处理,或者在我们需要的地方主动抛出一个异常。本文就对python中的错误、异常处理简单做一下说明和整理。
运用场景
- 让程序兼容性更强
- 发生错误时可以进行处理,让程序继续运行
- 主动抛出异常
异常列表
python2
异常 | 描述 |
---|---|
Exception | 所有异常的基类 |
NameError | 尝试访问一个没有申明的变量 |
SyntaxError | 语法错误 |
TypeError | 类型错误 |
KeyError | 请求一个不存在的字典关键字 |
KeyboardInterrupt | Ctrl+C |
IOError | 输入输出错误(比如你要读的文件不存在) |
ZeroDivisionError | 除数为0 |
IndexError | 索引超出序列范围 |
AttributeError | 尝试访问未知的对象属性 |
ValueError | 传给函数的参数类型不正确,比如给int()函数传入字符串形 |
AssertionError | assert语句失败 |
ImportError | 导入模块或包错误 |
IdentationError | 语法错误,没有对齐 |
1 | AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x |
python3
待续
异常处理
异常基础
在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!!
1 | try: |
异常种类
python中的异常种类非常多,每个异常专门用于处理某一项异常!!!
1 | AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x |
异常其他结构
1 | try: |
主动触发异常
1 | try: |
自定义异常
1 | class WupeiqiException(Exception): |
try…except…
- try…except…
- try…except…else…
当我们尝试打开一个不存在的文件时,python就会给我们抛出一个错误,python2是IOError,python3是FileNotFoundError。
1 | # python2 |
以 python2 的处理为例,如果我们已经知道会发生的错误类型,这时候我们就可以通过一个异常处理来捕捉到这个错误,并进行处理。
1 | try: |
运行上述代码,我们发现没有看到任何错误,并且打印了”get error”,说明我们已经用except捕捉到了IOError这个错误,然后输出了一个字符串(或者也可以直接pass,什么都不做)。
而当我们不是打开一个文件,而是打印一个不存在的变量呢。
1 | try: |
这时候又有错误抛出,并且这时候不是IOError了 而是NameError,而我们的except捕捉的不是这个错误。所以错误还是会抛出,这时候我们只要把except后面的异常改成NameError就行了。
1 | try: |
我们也可以用上面这种方式来捕捉到所有的异常。
try…finally…
- try…finally…
- try…except…finally…
这样的语句,中间不管捕捉到了什么,最后finally下面的代码都会运行,我们可以使用这种语句做一些类似清理,管理连接的操作。这里就不做演示了
异常其他结构
1 | try: |
异常的抛出机制:
- 如果在运行时发生异常,解释器会查找相应的处理语句(称为handler).
- 要是在当前函数里没有找到的话,它会将异常传递给上层的调用函数,看看那里能不能处理。
- 如果在最外层(全局“main”)还是没有找到的话,解释器就会退出,同时打印出traceback以便让用户找到错误产生的原因。
- 注意:虽然大多数错误会导致异常,但一个异常不一定代表错误,有时候它们只是一个警告,有时候它们可能是一个终止信号,比如退出循环等。
raise 异常抛出
1 | "name:") name = raw_input( |
使用raise我们可以主动抛出一个异常。
1 | class Continue(Exception): |
自定义异常
1 | class WupeiqiException(Exception): |
assert断言
python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
- assert expression [, arguments]
- assert 表达式 [, 参数]
1 | assert 1==1 |