ruby - повторно вызвать исключение за исключением - PullRequest
11 голосов
/ 05 декабря 2011

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

Ответы [ 3 ]

13 голосов
/ 05 декабря 2011

Взгляните на трюки из разговора Исключительный Рубин Авди Гримм:

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
5 голосов
/ 29 ноября 2013

Ruby 2.1 добавлено Исключение # вызывает возможность решить эту проблему.

4 голосов
/ 05 декабря 2011

Для Ruby версии 2.1 вы можете расширить 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

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

Для ruby ​​2.1 и выше вы можете использовать Exception#cause, как указано в другом ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...