Menu
CoddyTech

begin / rescue

本课属于 Coddy Ruby 学习旅程的“逻辑与流程”单元。第 44 课,共 56 课。

为了避免异常导致程序崩溃,请用 begin ... rescue ... end 包住有风险的代码。如果 begin 中的任何代码引发异常,Ruby 会跳转到匹配的 rescue 块,而不是终止程序。

begin
  result = 10 / 0
  puts result
rescue ZeroDivisionError
  puts "Cannot divide by zero!"
end
# 不能除以零!

你可以用 => e 捕获异常对象本身,并读取它的 .message:

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end
# 输入有误:Integer() 的值无效:"hello"

如果你不指定异常类,单独使用 rescue 会捕获 StandardError 及其子类,也就是大多数常见错误。只有当你能在 rescue 块中做点什么时,捕获才最有用:替换为默认值、记录问题,或再次询问用户。

challenge icon

挑战

简单

从输入中读取两行,两行都应该是整数,但第二行可能不是有效的数字。

使用 begin / rescue 包裹对第二行的解析:

  • 使用 Integer(input)(遇到无效字符串时会引发 ArgumentError)
  • 如果解析成功,打印 Sum: <a + b>
  • 如果解析失败,打印 Bad number!

输入 3,然后输入 4,输出为 Sum: 7。输入 3,然后输入 abc,输出为 Bad number!。

亲手试试

a = gets.to_i
raw_b = gets.chomp

# TODO:用 begin/rescue 包裹 Integer(raw_b);输出总和,或说明中指定的原样文本
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Ruby 在线编译器