DevCN
菜单
全部文章快讯开发深度热点

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。边界验证应同时包含刚好合法和刚好越界,才能发现比较符号写错的问题。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。