Ruby rescue 关键字
最后修改日期:2025 年 4 月 27 日
本教程将解释 Ruby 的 rescue
关键字用于异常处理。它通过优雅地处理运行时错误来防止程序崩溃。
rescue
关键字用于捕获 Ruby 代码中抛出的异常。它可以与 begin
/end
块一起使用,或者作为方法定义的一部分。
异常处理将正常的程序流程与错误逻辑分离开来。这使得代码更加健壮和易于维护。Ruby 提供了几个相关的关键字。
基本的 rescue 示例
这个简单的例子演示了如何捕获除零错误。rescue 块可以防止程序终止。
begin result = 10 / 0 puts "Result: #{result}" rescue => e puts "Error occurred: #{e.message}" end
该代码尝试进行无效的除法运算,从而触发异常。rescue 块会捕获它并打印错误消息,而不是导致程序崩溃。
捕获特定异常
Ruby 允许针对特定的异常类进行捕获。这为不同的错误类型提供了精确的控制。
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 用于修改表达式。当操作失败时,它会提供默认值。
value = Integer("abc") rescue 0 puts "Converted value: #{value}" data = JSON.parse("invalid") rescue {} puts "Parsed data: #{data.inspect}"
当解析失败时,rescue 子句会提供备用值。这种模式非常适合需要默认值的简单情况。
Ensure 用于清理
ensure
子句保证代码无论成功与否都会执行。它非常适合资源清理。
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 块。这使得可以从暂时性故障中自动恢复。
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 块。这为方法级别的错误处理提供了更简洁的语法。
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 程序可以定义和捕获自定义异常类。这使得可以进行特定于域的错误处理。
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 的 rescue 关键字,并通过示例展示了基本用法、特定异常、内联语法和自定义错误处理。
作者
列出 所有 Ruby 教程。