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
八、总结 #
本章我们学习了:
- begin/rescue:捕获异常
- ensure:资源清理
- else:成功时执行
- retry:重试机制
- 单行rescue:简洁写法
接下来让我们学习Ruby的自定义异常!
最后更新:2026-03-27