Отлавливание большого количества ошибок и помещение всех отлавливаемых ошибок в константу

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

Например:

FATAL_ERRORS = %w(Mechanize::ResponseCodeError RestClient::ServiceUnavailable OpenSSL::SSL::SSLError RestClient::BadGateway)

begin
  # Do some cool stuff
rescue FATAL_ERRORS => e
  puts "Exiting #{e}"

Что я пробовал:

Я попытался получить ошибку из текущего потока:

FATAL_ERRORS = Thread.current[:errors] ||= %w(Mechanize::ResponseCodeError RestClient::ServiceUnavailable OpenSSL::SSL::SSLError RestClient::BadGateway)

begin
  # Do some cool stuff
rescue FATAL_ERRORS => e
  puts "Exiting #{e}"

Также я пробовал оператор splat:

FATAL_ERRORS = %w(Mechanize::ResponseCodeError RestClient::ServiceUnavailable OpenSSL::SSL::SSLError RestClient::BadGateway)

begin
  # Do some cool stuff
rescue *FATAL_ERRORS => e
  puts "Exiting #{e}"

И знак, и нить создают следующее исключение: rescue in <main>': class or module required for rescue clause (TypeError)

Как я могу успешно исправить несколько ошибок, не поместив их все в строку восстановления и не выставив ее в плохом свете?


person YoYoYo I'm Awesome    schedule 25.08.2016    source источник


Ответы (1)


сплат работает. Проблема в том, как вы делаете FATAL_ERRORS константой. С нотацией %w он преобразует значение в строку:

 %w(Mechanize::ResponseCodeError)
 => ["Mechanize::ResponseCodeError"] # Note the string value instead of class constant.

Пытаться

FATAL_ERRORS = [Mechanize::ResponseCodeError, RestClient::ServiceUnavailable, OpenSSL::SSL::SSLError, RestClient::BadGateway]
person kiddorails    schedule 25.08.2016