Ruby 错误处理:使用 Integer 严格解析分钟数
区分数值转换和输入验证,使用 Integer 与范围判断拒绝坏数据,并在逐条处理时捕获预期输入错误。
本节目标
区分数值转换和输入验证,使用 Integer 与范围判断拒绝坏数据,并在逐条处理时捕获预期输入错误。
环境与运行方法
使用 Ruby 3.x 或更新版本,保存为 lesson.rb,执行 ruby -c lesson.rb 后运行 ruby lesson.rb。不依赖 Rails 或外部 gem。
核心思路
to_i 可能接受部分数字文本,不能当作严格验证。Integer(text,10) 明确十进制解析,失败抛异常;解析成功后还要检查一天分钟数的业务范围。
完整示例
def minutes(text)
raise TypeError, "text required" unless text.is_a?(String)
value = Integer(text, 10)
raise ArgumentError, "range" unless (0..1440).cover?(value)
value
end
["30", "0", "12x", "1441"].each do |text|
begin
puts "ok=#{minutes(text)}"
rescue ArgumentError, TypeError
puts "invalid"
end
end预期输出
ok=30
ok=0
invalid
invalid逐步理解
类型检查要求传入字符串,避免其他对象的转换行为进入协议。cover? 检查包含上下界的范围,每轮内部 rescue 确保失败不阻止后续记录。
输出统一为 invalid 是当前展示策略。如果需要区分格式和范围,可以定义错误类型。不要捕获所有异常后静默继续,程序本身的缺陷也应被看见,而不是一律伪装成用户数据错误。
常见问题与边界
- to_i 不能验证完整文本。
- Ruby 中只有 nil 和 false 为假值。
- 类型正确也不代表字符串长度合理。
动手练习
传入 "1440"、"-1" 与整数对象 30。
参考答案
第一项成功;负数触发 ArgumentError;整数对象触发 TypeError。文本 "30" 与整数 30 属于不同输入形态,本函数只接受前者。
文章回复
0 条公开回复