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 块中做点什么时,捕获才最有用:替换为默认值、记录问题,或再次询问用户。
挑战
简单从输入中读取两行,两行都应该是整数,但第二行可能不是有效的数字。
使用 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);输出总和,或说明中指定的原样文本
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Ruby 在线编译器