Почему я не могу отправить ошибку класса дальше вместе с цепочкой? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть ошибка в каком-то дочернем классе:

(byebug) e.class
CSV::MalformedCSVError
(byebug) e.message.truncate(150, omission: '')
"Illegal quoting in line 1. [SmarterCSV: csv line 1]"
(byebug) e
#<CSV::MalformedCSVError: Illegal quoting in line 1. [SmarterCSV: csv line 1]>
(byebug) raise e.class, e.message.truncate(150, omission: '')
*** ArgumentError Exception: wrong number of arguments (given 1, expected 2)

Я хочу отправить исходный класс ошибок и сообщение другому классу, чтобы спасти их всех без создания пользовательской ошибки длякаждый детский класс (ChildClassError = Class.new(StandardError)).

Буду благодарен за помощь.Я хотел бы понять причину.

Что здесь не так?

rescue StandardError => e
  raise e.class
end
*** ArgumentError Exception: wrong number of arguments (given 0, expected 2)

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Вы можете сделать это, просто избавившись от исключения StandardError, вот так:

class Foo
  attr_reader :value
  def initialize(value)
    @value = value
  end
end

begin
  foo = Foo.new
rescue StandardError => e
  raise e.class.new(e.message.truncate(150, omission: ''))
end

Хотя, таким образом, вы реинициализируете другой объект того же класса здесь с новым / измененным сообщением.

Редактировать: Алексей сделал хорошую точку зрения на арность, поскольку настраиваемые классы ошибок / исключений сделаны по-разному, чтобы иметь детальный контроль над исключениями, которые полезны при отладке.Убедитесь, что у вас есть правильная сила, иначе вы будете на охоте на гусей, а не на решение реальной проблемы.

0 голосов
/ 22 марта 2019

Проблема в том, что CSV::MalformedCSVError#new нарушает стандарт для исключений, ожидаемых Kernel#raise.

Последний пытается вызвать Exception#new/1, покаЕдинственная возможная арность конструктора CSV::MalformedCSVError - два.Вы должны создать объект самостоятельно:

raise CSV::MalformedCSVError.new(e.message.truncate(150, omission: ''), __LINE__)

В общем случае вы, вероятно, должны получить arity конструктора и вести себя соответственно.

...