Python 异常处理:把学习时长输入转换成可靠数据
设计一个只接收文本整数的学习时长解析函数,分开处理格式错误、类型错误和范围错误,让调用方得到明确结果而不是静默失败。
本节目标
设计一个只接收文本整数的学习时长解析函数,分开处理格式错误、类型错误和范围错误,让调用方得到明确结果而不是静默失败。
知识与使用场景
界面和 CSV 读取到的时长通常是文本。解析函数不应让字符串一路流入统计逻辑,而应在边界处转换成整数,并验证业务范围。本节规定时长为 0 到 1440 分钟的整数文本,首尾空白可以忽略。
输入类型与文本格式是两类问题。传入 None 属于调用约定错误,使用 TypeError;传入“小半天”或超出范围的整数文本,使用 ValueError。调用方可以决定分别展示不同信息,也可以统一标记为无效记录。
捕获异常的范围应尽量小。本节只围绕 int 转换捕获 ValueError,再给出更贴近业务的说明。不要包住整个程序后写一个空的 except,否则程序自身的错误也会被伪装成正常处理。
完整示例
def parse_minutes(text):
if not isinstance(text, str):
raise TypeError("时长必须以文本提供")
try:
minutes = int(text.strip())
except ValueError as exc:
raise ValueError("时长必须是整数文本") from exc
if not 0 <= minutes <= 1440:
raise ValueError("时长必须在0到1440之间")
return minutes
for raw in [" 45 ", "半小时", "-1"]:
try:
print(f"有效:{parse_minutes(raw)}")
except (TypeError, ValueError) as exc:
print(f"无效:{exc}")预期结果
有效:45
无效:时长必须是整数文本
无效:时长必须在0到1440之间运行与逐步理解
第一条输入经 strip 去掉空白后转换为整数 45。第二条无法转为整数,新的 ValueError 提供业务提示,from exc 保留原始异常链,便于排查转换为何失败。
第三条能够转成整数,所以格式没有问题;随后范围检查发现负数,再报告范围错误。这种顺序让“解析成功”和“业务有效”成为两道明确检查。
这里沿用 int 接受的整数文本语法,因而带正号等输入也可能被接受。若业务要求严格的 ASCII 十进制数字,需要另外定义字符规则。本例不会通过 float 再转 int 来悄悄截断小数,避免把 12.9 当成 12 分钟导入。
常见问题与边界
except Exception: pass会丢掉失败原因,让坏数据看似导入成功。- 不要用 eval 解析普通数字输入;它会把输入当作代码表达式。
- 0 和 1440 是合法边界,比较符号不能误写成严格小于。
- 记录错误日志时可保留行号和原因,避免把不必要的个人信息完整写入日志。
动手练习
验证 "0"、"1440"、"1441"、"12.5" 和 None,分别说明哪些成功、哪些报错。
参考答案
前两个分别返回 0 和 1440;1441 触发范围 ValueError,12.5 触发格式 ValueError,None 触发 TypeError。边界验证应同时包含刚好合法和刚好越界,才能发现比较符号写错的问题。
文章回复
0 条公开回复