ensure 和 raise
本课属于 Coddy Ruby 学习旅程的“逻辑与流程”单元。第 46 课,共 56 课。
还有两个部分可以补全错误处理工具集。
ensure 是一个无论如何都会运行的代码块,无论 begin 是否正常结束,或 rescue 分支是否捕获了异常,甚至异常是否未被捕获。你可以在这里放置清理代码:
begin
puts "opening file"
raise "something broke"
rescue
puts "caught it"
ensure
puts "closing file"
end
# 正在打开文件
# 捕获到了异常
# 正在关闭文件raise 是创建自定义异常的方式。传入一个字符串作为消息,或者传入一个类和一条消息:
def withdraw(amount)
raise ArgumentError, "amount must be positive" if amount <= 0
# ... 执行取款操作
end惯例是在方法开头尽早使用 raise,这样参数错误时就能快速失败。调用方可以在有合适的恢复方法时使用 rescue,也可以让异常继续向上冒泡。
挑战
简单定义一个方法 safe_divide(a, b),该方法:
- 如果
b == 0,则引发ArgumentError,并显示消息"b cannot be zero" - 否则返回
a / b
然后从输入中读取两个整数。在 begin / rescue / ensure 中调用 safe_divide:
- 成功时,打印
Result: <value> - 发生
ArgumentError时,打印Error: <message> - 在
ensure中,始终打印Done.
输入 10 / 2 时,输出为:
Result: 5
Done.输入 10 / 0 时:
Error: b cannot be zero
Done.亲手试试
# TODO: 定义 safe_divide(a, b),当 b == 0 时抛出 ArgumentError
a = gets.to_i
b = gets.to_i
# TODO: 用 begin ... 输出 Result;用 rescue ArgumentError => e ... 输出 Error;用 ensure ... 输出 Done。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Ruby 在线编译器