Python使用被称为异常的特殊对象来表达执行期间发现的错误。当这些异常没有被捕获并处理时,程序将停止,并向控制台打印错误信息。这个错误信息通常是一个traceback,包含了异常的类型,以及诱发这个异常的代码位置及调用栈细节。
版权声明
本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。
本文不可以以纸质出版为目的进行改编、摘抄。
本文节选自作者的《Python编程基础及应用》视频教程。
1. 曾经的异常
在本书的前半部分,我们已经遇到过很多异常:
异常类 | 说明 |
---|---|
ValueError | 值与期望的不符 |
IndentationError | 代码缩进错误 |
IndexError | 序列索引不存在 |
AssertionError | 断言失败 |
NameError | 名字不存在 |
KeyError | 映射(比如字典)中的键不存在 |
AttributeError | 属性错误(对象无指定名字的属性) |
TypeError | 类型出错 |
SyntaxError | 代码语法错误 |
OSError | 操作系统未能执行指定任务 |
ZeroDivisionError | 除0错误 |
这些异常类,都继承自Exception类型。在本书的前半部分,我们对于这些异常采取了放任的态度: 程序直接报错停止。但一个严谨的程序,应该捕获并处理这些异常。
异常发生后 |
---|
- 捕获并处理异常,尝试将程序从异常中拯救出来,继续正常运行。 |
- 捕获并处理异常,至少做一些必要的紧急操作,避免严重后果的发生。比如,汽车的车载控制系统发现发动机的“异常高温”(可能意味着起火)异常,应尝试切断油路,迫使汽车减速停车;一个股票交易系统发现无法恢复的异常,应尝试关闭数据库连接,并将没有保存的文件全部存盘。 |
- 捕获并处理异常,最低限度,作者认为应该将异常信息保存在错误日志中,以便程序员查找错误发生的原因。 |
2. try except else finally
下述代码展示了一个完整的异常处理程序:
#try.py
def divide(a, b):
return a/b
while True:
sFirst = input("First number:")
sSecond = input("Second number:")
if sFirst == "q" or sSecond == "q":
break
try:
iFirst = int(sFirst)
iSecond = int(sSecond)
fResult = divide(iFirst,iSecond)
except (ZeroDivisionError) as e