程序实例:
def division(x, y):
return x / y
print(division(10,2))
print(division(5, 2))
print(division(3, 0))
由于最后一行输出中,传入的第2个参数为0,导致出现ZeroDivisionError: division by zero
错误。
使用try/except语句可以捕获异常,它的语法格式如下:
try:
指令 # 预设可能引发错误异常的指令
except 异常对象1 # 如ZeroDivisionError
异常处理程序1
try语句按照如下方式工作:
一个try语句可能包含多个except子句,分别用来处理不同的特定的异常,但最多只有一个分支会被执行。处理程序只针对对应的try子句中的异常进行处理。
程序实例:
def division(x, y):
try: # try - except指令
return x / y
except ZeroDivisionError: # 除数为0时执行
print("除数不能为0!")
print(division(4, 2))
print(division(4, 0))
print(division(3, 2))
执行结果:
2.0
除数不能为0!
None
1.5
如果在执行try子句的过程中发生了异常,但这个异常不是预设的except异常对象,表示异常未被捕捉到,此时依旧会出现错误信息。
程序实例:
def division(x, y):
try: # try - except指令
return x / y
except ZeroDivisionError: # 除数为0时执行
print("除数不能为0!")
print(division(4, 2))
print(division(4, 0))
print(division(2, 'b'))
print(division(3, 2))
由执行结果可以看出,新出现的异常为TypeError,而在程序中没有设计对应的异常处理程序。因此需要对程序进行扩充。
def division(x, y):
try: # try - except指令
return x / y
except ZeroDivisionError: # 除数为0时执行
print("除数不能为0!")
except TypeError: # 类型错误
print("除法数据类型不符!")
print(division(4, 2))
print(division(4, 0))
print(division(2, 'b'))
print(division(3, 2))
执行结果:
2.0
除数不能为0!
None
除法数据类型不符!
None
1.5
try/except语句还有一个可选的else子句。这个子句在使用时必须放在所有的except子句之后。在try子句中没有发生任何异常时,else子句才会执行。语法格式如下:
try:
指令 # 预先设想可能引发异常的指令
except 异常对象1:
异常处理程序1
else:
正确处理程序 # 没有异常时执行此区块指令
程序实例:
def division(x, y):
try: # try - except指令
ans = x / y
except ZeroDivisionError: # 除数为0时执行
print("除数不能为0!")
except TypeError: # 类型错误
print("除法数据类型不符!")
else:
return ans
print(division(4, 2))
print(division(4, 0))
print(division(2, 'b'))
print(division(3, 2))
执行结果:
2.0
除数不能为0!
None
除法数据类型不符!
None
1.5
程序设计时一个经常发生的异常是打开文档时找不到文档,这时会产生FileNotFoundError异常。
程序实例:
fn = 'data15_3.txt' # 设置要打开的文件
try:
with open(fn) as file_Obj: # 以只读模式打开文件,返回file_Obj
data = file_Obj.read # 读取文件内容到data
except FileNotFoundError:
print("找不到 %s 文档" % fn)
else:
print(data)
执行结果:
找不到 data15_3.txt 文档
异常对象名称 | 说明 |
---|---|
AttributeError | 通常是指对象没有这个属性 |
Exception | 通用型异常,一般错误皆可使用 |
FileNotFoundError | 找不到open()打开的文档 |
IOError | 在输入或输出时发生错误 |
IndexError | 索引超出范围区间 |
KeyError | 在映射中没有这个键 |
MemoryError | 需求内存空间超出范围 |
NameError | 对象名称未声明 |
SyntaxError | 语法错误 |
SystemError | 直译器的系统错误 |
TypeError | 数据类型错误 |
ValueError | 输入无效参数 |
ZeroDivisionError | 除数为0 |
使用通用型异常对象exception可以捕捉各种异常。
程序实例:
def division(x, y):
try: # try - except指令
ans = x / y
except Exception: # 通用型异常
print("通用错误发生!")
else:
return ans
print(division(3, 2))
print(division(2, 0))
print(division('a', 'b'))
print(division(4, 3))
执行结果:
1.5
通用错误发生!
None
通用错误发生!
None
1.3333333333333333
Python的关键词finally的功能是与try配合使用,在try之后可以有except或else,finally关键词必须放在except和else之后,不论是否有异常发生,都会执行finally中的程序代码。
try:
指令 # 预先设想可能引发异常的指令
except 异常对象:
异常处理程序
finally:
程序代码段 # 必定执行
程序实例:
def division(x, y):
try: # try - except指令
return x / y
except Exception: # 通用型异常
print("异常发生!")
finally:
print("阶段任务完成")
print(division(3, 2), "\n")
print(division(2, 0), "\n")
print(division('a', 'b'), "\n")
print(division(4, 3), "\n")
执行结果:
阶段任务完成
1.5
异常发生!
阶段任务完成
None
异常发生!
阶段任务完成
None
阶段任务完成
1.3333333333333333
往期文章: