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
四、总结 #
本章我们学习了:
- 创建自定义异常:继承StandardError
- 添加属性:自定义信息
- 异常层次:组织异常类
- 实用示例:业务异常、验证异常
接下来让我们学习Ruby的文件操作!
最后更新:2026-03-27