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

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 属于不同输入形态,本函数只接受前者。

DISCUSSION

文章回复

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