学习前提
理解Python函数、返回值和类型转换。
本课完成后你能做什么
区分格式错误、范围错误与程序错误,提供可恢复反馈。
先理解机制
异常代表当前执行路径不能继续按原计划完成,try只包住你准备处理的操作。int转换可能抛ValueError,文件读取可能抛OSError,不应一律用except Exception返回0,否则真实缺陷会变成看似成功的数据。
格式转换与业务范围是两步。字符串可以成功转换成整数,但-3仍可能不满足时长规则。函数返回None与合法0要分清,调用者用is None判断失败,不能用if not value把0误判。
错误信息应该告诉用户如何改正,日志可保留开发者诊断。交互重试应有退出路径,不能写一个永不停止的while True困住用户。批处理场景则可以收集错误行,让调用者决定跳过还是停止。
finally适合释放资源,不适合无条件宣告成功。with管理文件更直接。重试也不是所有失败的答案:格式错误不改变输入就重试,结果仍然一样。
可运行示例
使用Python 3.11或更新版本,将代码保存为独立练习目录中的lesson.py,在该目录执行 python3 lesson.py;Windows也可使用 py lesson.py。示例只使用标准库。
def parse_minutes(raw):
try:
value = int(raw.strip())
except ValueError:
return None, "Enter a whole number."
if not 0 <= value <= 240:
return None, "Use a value from 0 to 240."
return value, ""
for raw in ["0", " 25 ", "2.5", "-1", ""]:
value, error = parse_minutes(raw)
print(repr(raw), value, error or "OK")
推演与验证
0与带空格25通过,小数和空值是格式错误,-1是范围错误。把输入改为241,确认不是格式提示。这个函数约定raw为字符串;若调用者传None,应在上游满足约定或明确扩展类型策略。
常见错误与边界
捕获ValueError不会捕获AttributeError,这正好能暴露传错类型的调用问题。不要为了让测试全部绿而扩大except范围到所有异常。
动手练习
为批量输入返回有效分钟列表和错误报告,报告包含原位置与原因,保持输入顺序。
参考解法与理由
enumerate逐项调用解析函数,用value is None分流。累积报告而不是在第一条失败时丢弃之前的有效结果;是否最终接受部分成功由调用者决定。