用 try/except/else/finally 捕获可预见的失败,并抛出你自己的异常来标示无效数据。
在 Kodokon 中打开本课真实的程序总会失败:文件缺失、输入无效、网络中断。Python 用异常来标示这些情况:异常会中断执行,并沿着调用栈向上传播,直到某个 try/except 捕获它。专业的反应是:捕获尽可能具体的异常,并且尽可能靠近你知道该怎么处理的地方。
def parse_age(text):
try:
return int(text)
except ValueError:
return None
print(parse_age("34")) # 34
print(parse_age("thirty")) # None完整的结构有四个分支。try 包含有风险的代码,except 处理失败,else 仅在没有异常被抛出时运行,而 finally 在任何情况下都会运行 - 非常适合释放资源或记录日志。else 的意义在于:让 try 保持最小,这样你一眼就能看出哪一行可能出错。
values = ["10", "abc", "25"]
total = 0
for value in values:
try:
number = int(value)
except ValueError:
print(f"Skip : {value}")
else:
total += number
finally:
print(f"Process : {value}")
print(total) # 35只要收到的某个数据无效,你的函数也可以用 raise 抛出自己的异常:带着清晰的消息立刻失败,好过产出一个错误的结果。请定义一个继承自 Exception 的专用类:这样调用方就能有针对性地捕获它,而不会误伤其他错误。
class EmptyCartError(Exception):
pass
def checkout(items):
if not items:
raise EmptyCartError("Empty cart.")
return round(sum(items), 2)
try:
print(checkout([]))
except EmptyCartError as error:
print(f"Error : {error}")