异常处理
begin/rescue/ensure、raise 抛出、自定义异常类、retry
异常处理
Ruby 用 begin/rescue/ensure 处理异常。retry 重试整个 begin 块。
学完本章你将: 掌握 begin/rescue/ensure、raise、自定义异常、retry。
基本结构
ruby
begin
result = 10 / 0
rescue ZeroDivisionError => e
puts "除零错误: #{e.message}"
rescue StandardError => e
puts "其他错误: #{e.class}"
else
puts "没有异常——#{result}" # 无异常时执行
ensure
puts "无论异常与否——都会执行"
end
raise 与自定义异常
ruby
# raise —— 抛出异常
def validate!(age)
raise ArgumentError, "年龄必须为正数" if age < 0
end
# 自定义异常
class ValidationError < StandardError
attr_reader :field
def initialize(field, message)
@field = field
super("#{field}: #{message}")
end
end
raise ValidationError.new(:age, "必须为正数")
retry —— 重试
ruby
attempts = 0
begin
attempts += 1
puts "尝试第 #{attempts} 次"
risky_operation
rescue StandardError
retry if attempts < 3 # 最多重试 3 次
raise
end