Я исхожу из фона С#, где я обычно переписываю исключения с исходным исключением, содержащимся внутри родительского исключения. Есть ли аналогичная концепция в Ruby? Как я могу обнаружить и создать исключение, сохраняя контекст исключения более низкого уровня?
Исключение ruby - re-raise с дополнительным исключением
Ответ 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
Ответ 2
Ruby 2.1 добавил Функция исключения # причины для решения этой проблемы.
Ответ 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
При таком подходе вы сможете повысить стандартные рубиновые ошибки и установить для них родительскую ошибку, а не только свои пользовательские ошибки.