Python中的异常处理

Python异常处理详解

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


当Python程序无法正常处理一个程序时,那么它就会抛出一个异常。异常是Python对象,表示一个错误。当Python脚本发生异常时,我们需要捕获并且处理它,否则程序会终止执行。

Python主要支持五种异常机制,接下来具体说明这几种异常机制。


第一种,默认的异常处理器

s = 'Hello World'
print s[123]
print 'not here'

如果我们没有对异常进行任何处理,那么在程序执行的过程中发生异常,系统就会中断程序,并且调用Python默认的异常处理器,并在终端中输出异常信息。如果调用默认的异常处理器,那么发生异常的程序的后续程序都不会被执行,即第三行不会被执行。

# output
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

第二种,try……except….

s = 'hello world'
try:
    print s[123]
except IndexError:
    print 'err...'
print 'here...'

当程序执行到try语句的时候,会进入try语句块执行。如果没有发生异常,那么久执行try语句块中的程序。如果发生异常了,那么就会寻找后面是否有except语句。找到except语句之后,会调用这个自定义的异常处理器。except将异常处理完之后,程序会继续往下执行。也就是说,代码中的两个print都会被执行。

# output
err...
here...

第三种,try……finally….

s = 'hello world'
try:
    print s[12]
finally:
    print 'err...'
print 'here...'

当程序执行到finally语句时,无论异常发生与否,finally中的语句都会被执行。但是,由于没有except处理机制,finally指向完毕后程序会被中断。这种情况下,后续的程序都不会被执行。

# output
err...
Traceback (most recent call last):
  File "jianshu.py", line 6, in <module>
    print s[12]
IndexError: string index out of range

第四种,assert

a = 1
assert a<0, 'the message for error'
print 'here...'

assert也成为断言,这个语句先判断assert后面紧跟的语句是 True 还是 False 。如果是False,则中断程序,调用默认的异常处理器,同事输出assert语句逗号后面的提示信息。在本例子中,程序被中断了,提示了the message for error,后续的程序不会被执行。

Traceback (most recent call last):
  File "jianshu.py", line 5, in <module>
    assert a<0, 'the message for error'
AssertionError: the message for error

第五种,with……as

with open('a.txt', 'r') as f:
    print 2/0
print 'continue...'

我们平时在使用类似文件的流对象时,使用完毕之后要调用close方法进行关闭,这很麻烦。with…as 语句给我们提供了一个非常方便的替代方法:open 打开文件之后将返回的文件流对象赋值给 f,然后再 with 语句块中使用。with 语句块完毕之后,会隐藏地自动关闭文件。如果在 with 语句或者语句块中发生异常,会调用默认的异常处理器进行处理,但文件还是会正常关闭。这种情况下,会抛出异常,最后的print不执行。

# output
Traceback (most recent call last):
  File "jianshu.py", line 5, in <module>
    print 2/0
ZeroDivisionError: integer division or modulo by zero

附:python标准异常
BaseExceptiona:所有异常的基类
SystemExitb python:解释器请求退出
KeyboardInterruptc:用户中断执行(通常是输入^C)
Exceptiond:常规错误的基类
StopIteratione:迭代器没有更多的值
GeneratorExita:生成器(generator)发生异常来通知退出
SystemExith:Python 解释器请求退出
StandardErrorg:所有的内建标准异常的基类
ArithmeticErrord:所有数值计算错误的基类
FloatingPointErrord:浮点计算错误
OverflowError:数值运算超出最大限制
ZeroDivisionError:除(或取模)零 (所有数据类型)
AssertionErrord:断言语句失败
AttributeError:对象没有这个属性
EOFError:没有内建输入,到达EOF 标记
EnvironmentErrord:操作系统错误的基类
IOError:输入/输出操作失败
OSErrord:操作系统错误
WindowsErrorh Windows:系统调用失败
ImportError:导入模块/对象失败
KeyboardInterruptf:用户中断执行(通常是输入^C)
LookupErrord:无效数据查询的基类
IndexError:序列中没有没有此索引(index)
KeyError:映射中没有这个键
MemoryError:内存溢出错误(对于Python 解释器不是致命的)
NameError:未声明/初始化对象 (没有属性)
UnboundLocalErrorh:访问未初始化的本地变量
ReferenceErrore:弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError:一般的运行时错误
NotImplementedErrord:尚未实现的方法
SyntaxError:Python 语法错误
IndentationErrorg:缩进错误
TabErrorg:Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError:对类型无效的操作
ValueError:传入无效的参数
UnicodeErrorh:Unicode 相关的错误
UnicodeDecodeErrori:Unicode 解码时的错误
UnicodeEncodeErrori:Unicode 编码时错误
UnicodeTranslateErrorf:Unicode 转换时错误
Warningj:警告的基类
DeprecationWarningj:关于被弃用的特征的警告
FutureWarningi:关于构造将来语义会有改变的警告
OverflowWarningk:旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarningi:关于特性将会被废弃的警告
RuntimeWarningj:可疑的运行时行为(runtime behavior)的警告
SyntaxWarningj:可疑的语法的警告
UserWarningj:用户代码生成的警告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值