Исключение ruby ​​- re-raise с дополнительным исключением

Я исхожу из фона С#, где я обычно переписываю исключения с исходным исключением, содержащимся внутри родительского исключения. Есть ли аналогичная концепция в Ruby? Как я могу обнаружить и создать исключение, сохраняя контекст исключения более низкого уровня?

Ответ 1

Взгляните на трюки из беседы Исключительный Ruby от Avdi Grimm:

class MyError < StandardError
  attr_reader :original
  def initialize(msg, original=nil);
    super(msg);
    @original = original;
  end
end
# ...
rescue => error
  raise MyError.new("Error B", error)
end

Ответ 3

Вы можете расширить StandardError:

class StandardError
   attr_accessor :original
end

и когда вы создаете исключение, просто установите это свойство:

def reraise ex, original
   ex.original = original
   raise ex
end

rescue StandardError => e
   reraise ArgumentError.new('Message'), e
end

При таком подходе вы сможете повысить стандартные рубиновые ошибки и установить для них родительскую ошибку, а не только свои пользовательские ошибки.