Z
ZHANK
面向对象

异常处理

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