捕获大量错误并将所有错误捕获到常量中

时间:2016-08-25 21:21:14

标签: ruby error-handling rescue

如果错误在数组中,是否有一种方法,在救援条款中,将所有错误放入数组并从那里调用它们?

例如:

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}"

splat和线程都会产生以下异常: rescue in <main>': class or module required for rescue clause (TypeError)

如何在不将所有错误全部放在救援线上并使其看起来不好的情况下成功挽救多个错误?

1 个答案:

答案 0 :(得分:1)

splat确实有效。问题在于你使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]