Ruby自定义异常 #

一、创建自定义异常 #

1.1 基本用法 #

ruby
class CustomError < StandardError
end

raise CustomError, "Something went wrong"

1.2 添加消息 #

ruby
class ValidationError < StandardError
  attr_reader :field

  def initialize(field, message)
    @field = field
    super("#{field}: #{message}")
  end
end

raise ValidationError.new("email", "is invalid")

1.3 添加属性 #

ruby
class APIError < StandardError
  attr_reader :status_code, :response

  def initialize(message, status_code:, response: nil)
    @status_code = status_code
    @response = response
    super(message)
  end
end

begin
  raise APIError.new("Not found", status_code: 404)
rescue APIError => e
  puts "#{e.message} (#{e.status_code})"
end

二、异常层次结构 #

2.1 组织异常 #

ruby
module Errors
  class BaseError < StandardError; end

  class ValidationError < BaseError; end
  class AuthenticationError < BaseError; end
  class AuthorizationError < BaseError; end

  class NotFoundError < BaseError
    attr_reader :resource

    def initialize(resource)
      @resource = resource
      super("#{resource} not found")
    end
  end
end

2.2 捕获层次 #

ruby
begin
  risky_operation
rescue Errors::ValidationError => e
  puts "Validation: #{e.message}"
rescue Errors::BaseError => e
  puts "Base error: #{e.message}"
rescue => e
  puts "Unknown error: #{e.message}"
end

三、实用示例 #

3.1 业务异常 #

ruby
class InsufficientFundsError < StandardError
  attr_reader :balance, :amount

  def initialize(balance, amount)
    @balance = balance
    @amount = amount
    super("Insufficient funds: balance=#{balance}, required=#{amount}")
  end
end

class BankAccount
  def withdraw(amount)
    raise InsufficientFundsError.new(@balance, amount) if amount > @balance
    @balance -= amount
  end
end

3.2 验证异常 #

ruby
class ValidationFailedError < StandardError
  attr_reader :errors

  def initialize(errors)
    @errors = errors
    super("Validation failed: #{errors.join(', ')}")
  end
end

class User
  def validate!
    errors = []
    errors << "Name is required" if name.nil?
    errors << "Email is invalid" unless valid_email?
    raise ValidationFailedError.new(errors) if errors.any?
  end
end

四、总结 #

本章我们学习了:

  1. 创建自定义异常:继承StandardError
  2. 添加属性:自定义信息
  3. 异常层次:组织异常类
  4. 实用示例:业务异常、验证异常

接下来让我们学习Ruby的文件操作!

最后更新:2026-03-27