Menu
CoddyTech

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,也可以让异常继续向上冒泡。

challenge icon

挑战

简单

定义一个方法 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。
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Ruby 在线编译器