Ruby异常捕获 #

一、基本语法 #

ruby
begin
  risky_operation
rescue => e
  handle_error(e)
end

二、捕获异常 #

2.1 捕获所有异常 #

ruby
begin
  1 / 0
rescue => e
  puts "Error: #{e.message}"
end

2.2 捕获特定异常 #

ruby
begin
  1 / 0
rescue ZeroDivisionError => e
  puts "Division error: #{e.message}"
end

2.3 捕获多个异常 #

ruby
begin
  risky_operation
rescue ZeroDivisionError, TypeError => e
  puts "Error: #{e.message}"
end

2.4 多个rescue块 #

ruby
begin
  risky_operation
rescue ZeroDivisionError => e
  puts "Division error"
rescue TypeError => e
  puts "Type error"
rescue => e
  puts "Other error"
end

三、ensure #

3.1 基本用法 #

ruby
begin
  file = File.open("test.txt")
  process(file)
rescue => e
  puts "Error: #{e.message}"
ensure
  file&.close
end

3.2 资源清理 #

ruby
def with_file(path)
  file = File.open(path)
  begin
    yield file
  ensure
    file.close
  end
end

with_file("test.txt") do |f|
  puts f.read
end

四、else #

4.1 基本用法 #

ruby
begin
  result = risky_operation
rescue => e
  puts "Error: #{e.message}"
else
  puts "Success: #{result}"
ensure
  puts "Cleanup"
end

4.2 返回值 #

ruby
def safe_divide(a, b)
  begin
    a / b
  rescue ZeroDivisionError
    nil
  else
    a / b
  end
end

五、retry #

5.1 重试机制 #

ruby
retries = 0

begin
  connect_to_server
rescue NetworkError => e
  retries += 1
  if retries < 3
    sleep 1
    retry
  else
    raise
  end
end

5.2 指数退避 #

ruby
def with_retry(max_retries: 3)
  retries = 0
  delay = 1

  begin
    yield
  rescue => e
    retries += 1
    if retries < max_retries
      sleep delay
      delay *= 2
      retry
    else
      raise
    end
  end
end

六、单行rescue #

ruby
result = risky_operation rescue default_value
result = risky_operation rescue nil

七、实用示例 #

7.1 安全执行 #

ruby
def safe_execute
  yield
rescue => e
  log_error(e)
  nil
end

result = safe_execute { risky_operation }

7.2 超时处理 #

ruby
require 'timeout'

def with_timeout(seconds)
  Timeout.timeout(seconds) do
    yield
  end
rescue Timeout::Error
  puts "Operation timed out"
  nil
end

八、总结 #

本章我们学习了:

  1. begin/rescue:捕获异常
  2. ensure:资源清理
  3. else:成功时执行
  4. retry:重试机制
  5. 单行rescue:简洁写法

接下来让我们学习Ruby的自定义异常!

最后更新:2026-03-27