ZetCode

Ruby rescue 关键字

最后修改日期:2025 年 4 月 27 日

本教程将解释 Ruby 的 rescue 关键字用于异常处理。它通过优雅地处理运行时错误来防止程序崩溃。

rescue 关键字用于捕获 Ruby 代码中抛出的异常。它可以与 begin/end 块一起使用,或者作为方法定义的一部分。

异常处理将正常的程序流程与错误逻辑分离开来。这使得代码更加健壮和易于维护。Ruby 提供了几个相关的关键字。

基本的 rescue 示例

这个简单的例子演示了如何捕获除零错误。rescue 块可以防止程序终止。

basic_rescue.rb
begin
  result = 10 / 0
  puts "Result: #{result}"
rescue => e
  puts "Error occurred: #{e.message}"
end

该代码尝试进行无效的除法运算,从而触发异常。rescue 块会捕获它并打印错误消息,而不是导致程序崩溃。

捕获特定异常

Ruby 允许针对特定的异常类进行捕获。这为不同的错误类型提供了精确的控制。

specific_rescue.rb
begin
  File.open("nonexistent.txt") do |file|
    puts file.read
  end
rescue Errno::ENOENT
  puts "File not found"
rescue IOError => e
  puts "IO error: #{e.message}"
end

不同的 rescue 块处理不同的异常。第一个捕获文件未找到的错误,第二个处理通用的 IO 错误。

内联 rescue

Ruby 支持一种简洁的形式,其中 rescue 用于修改表达式。当操作失败时,它会提供默认值。

inline_rescue.rb
value = Integer("abc") rescue 0
puts "Converted value: #{value}"

data = JSON.parse("invalid") rescue {}
puts "Parsed data: #{data.inspect}"

当解析失败时,rescue 子句会提供备用值。这种模式非常适合需要默认值的简单情况。

Ensure 用于清理

ensure 子句保证代码无论成功与否都会执行。它非常适合资源清理。

ensure_clause.rb
file = nil
begin
  file = File.open("data.txt", "w")
  file.puts "Important data"
  raise "Simulated error"
rescue => e
  puts "Error writing file: #{e}"
ensure
  file.close if file
  puts "File handle closed"
end

ensure 块会在写入成功或失败时关闭文件。这可以防止在所有情况下发生资源泄漏。

重试机制

retry 关键字会在 rescue 之后重新执行 begin 块。这使得可以从暂时性故障中自动恢复。

retry_mechanism.rb
attempts = 0

begin
  attempts += 1
  puts "Attempt #{attempts}"
  raise "Network error" if attempts < 3
rescue
  retry if attempts < 3
  puts "Maximum attempts reached"
end

该代码最多重试失败的操作三次。三次尝试后,它将放弃并继续进行错误处理。

方法中的 Rescue

方法可以使用 rescue,而无需显式的 begin/end 块。这为方法级别的错误处理提供了更简洁的语法。

method_rescue.rb
def calculate_ratio(a, b)
  a / b
rescue ZeroDivisionError
  Float::INFINITY
rescue TypeError => e
  puts "Invalid input: #{e.message}"
  nil
end

puts calculate_ratio(10, 0)
puts calculate_ratio(10, "2")

该方法可以优雅地处理除法错误和类型不匹配。每个 rescue 子句都处理特定的故障模式。

使用 Rescue 定义自定义异常

Ruby 程序可以定义和捕获自定义异常类。这使得可以进行特定于域的错误处理。

custom_exceptions.rb
class TemperatureError < StandardError; end

def check_temperature(temp)
  raise TemperatureError, "Too hot!" if temp > 40
  raise TemperatureError, "Too cold!" if temp < 10
  puts "Temperature OK"
rescue TemperatureError => e
  puts "Warning: #{e.message}"
end

check_temperature(45)
check_temperature(5)
check_temperature(25)

自定义的 TemperatureError 类提供了有意义的错误分类。rescue 块可以统一处理所有与温度相关的 问题。

来源

Ruby 异常文档

本教程介绍了 Ruby 的 rescue 关键字,并通过示例展示了基本用法、特定异常、内联语法和自定义错误处理。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Ruby 教程