使用 splat 捕捉错误不起作用

Using a splat to catch errors is not working

我有很多错误需要捕获,所以我将它们全部放入两个数组中并创建一个常量来保存它们,但是,当我 运行 我收到异常的程序时:

C:/Users/thomas_j_perkins/bin/ruby/tool/sql_tool/whitewidow/lib/imports/constants_and_requires.rb:62:in `<top (required)>': uninitialized constant RestClient::MaxRedirectsReached (NameError)
        from whitewidow.rb:6:in `require_relative'
        from whitewidow.rb:6:in `<main>'

常量如下所示:

LOADING_ERRORS = [RestClient::ResourceNotFound, RestClient::InternalServerError, RestClient::RequestTimeout,
                RestClient::Gone, RestClient::SSLCertificateNotVerified, RestClient::Forbidden,
                OpenSSL::SSL::SSLError, Errno::ECONNREFUSED, URI::InvalidURIError, Errno::ECONNRESET,
                Timeout::Error, OpenSSL::SSL::SSLError, Zlib::GzipFile::Error, RestClient::MultipleChoices,
                RestClient::Unauthorized, SocketError, RestClient::BadRequest, RestClient::ServerBrokeConnection,
                RestClient::MaxRedirectsReached]
FATAL_ERRORS = [Mechanize::ResponseCodeError, RestClient::ServiceUnavailable, OpenSSL::SSL::SSLError,
                RestClient::BadGateway]

我是这样使用它们的:

begin
  # Do some cool stuff
rescue *FATAL_ERRORS => e
  puts e
end

--

begin
  # Do some more cool stuff
rescue *LOADING_ERRORS => e
  puts e
end

我是不是做错了什么,我会收到最需要的错误?以防万一你需要它这里是错误指定的整个需要的文件:

# Built in libraries
require 'rubygems'
require 'bundler/setup'
require 'mechanize'
require 'nokogiri'
require 'rest-client'
require 'timeout'
require 'uri'
require 'fileutils'
require 'yaml'
require 'date'
require 'optparse'
require 'tempfile'
require 'socket'
require 'net/http'

# Created libraries
require_relative '../../lib/modules/format'
require_relative '../../lib/misc/credits'
require_relative '../../lib/misc/legal'
require_relative '../../lib/misc/spider'
require_relative '../../lib/modules/copy'
require_relative '../../lib/modules/site_info'
require_relative '../../lib/modules/expansion/string_expan'

# Modules that need to be included
include Format
include Credits
include Legal
include Whitewidow
include Copy
include SiteInfo

# Constants used throughout the program
=begin
USER_AGENTS = { # Temporary fix for user agents until I can refactor the YAML file
    1 => 'Mozilla/5.0 (compatible; 008/0.83; http://www.80legs.com/webcrawler.html) Gecko/2008032620',
    2 => 'Mozilla/5.0 (compatible; U; ABrowse 0.6; Syllable) AppleWebKit/420+ (KHTML, like Gecko)',
    3 => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3pre) Gecko/20100403 Lorentz/3.6.3plugin2pre (.NET CLR 4.0.20506)',
    4 => 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)',
    5 => 'igdeSpyder (compatible; igde.ru; +http://igde.ru/doc/tech.html)',
    6 => 'larbin_2.6.3 (ltaa_web_crawler@groupes.epfl.ch)',
    7 => 'Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-T550 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.3 Chrome/38.0.2125.102 Safari/537.36',
    8 => 'Dalvik/2.1.0 (Linux; U; Android 6.0.1; Nexus Player Build/MMB29T)',
    9 => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1',
    10 => 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
}
=end
FORMAT = Format::StringFormat.new
PATH = Dir.pwd
VERSION = Whitewidow.version
SEARCH = File.readlines("#{PATH}/lib/lists/search_query.txt").sample
USER_AGENTS = YAML.load_file("#{PATH}/lib/lists/rand-age.yml")
OPTIONS = {}
USER_AGENT = USER_AGENTS[rand(1..10)]
SKIP = %w(/webcache.googleusercontent.com whosebug.com github.com)
LOADING_ERRORS = [RestClient::ResourceNotFound, RestClient::InternalServerError, RestClient::RequestTimeout,
                RestClient::Gone, RestClient::SSLCertificateNotVerified, RestClient::Forbidden,
                OpenSSL::SSL::SSLError, Errno::ECONNREFUSED, URI::InvalidURIError, Errno::ECONNRESET,
                Timeout::Error, OpenSSL::SSL::SSLError, Zlib::GzipFile::Error, RestClient::MultipleChoices,
                RestClient::Unauthorized, SocketError, RestClient::BadRequest, RestClient::ServerBrokeConnection,
                RestClient::MaxRedirectsReached]
FATAL_ERRORS = [Mechanize::ResponseCodeError, RestClient::ServiceUnavailable, OpenSSL::SSL::SSLError,
                RestClient::BadGateway]

我安装了 mechanizerest-client

gem install mechanize gem install rest-client

然后我打开了一个 IRB 会话

require mechanize require rest-client

然后测试了你的 FATAL_ERROR 数组并且能够引发错误并用你的代码处理它。

因此您使用 * splat 运算符的方式没有问题。

问题出在您的 LOADING_ERRORS 数组中。

当我尝试用你的 LOADING_ERRORS 数组做同样的事情时,我得到了和你一样的错误信息。

我克隆了 rest-client git 存储库并在 lib/restclient/exceptions.rb 文件中搜索,似乎没有定义 RestClient::MaxRedirectsReached

如果您从数组中删除该异常,代码就可以工作。

在存储库中进一步研究后,有一个 history.md 文件,它指出:

  • Changes to redirection behavior: (#381, #484)
    • Remove RestClient::MaxRedirectsReached in favor of the normal ExceptionWithResponse subclasses. This makes the response accessible on the exception object as .response, making it possible for callers to tell what has actually happened when the redirect limit is reached.
    • When following HTTP redirection, store a list of each previous response on the response object as .history. This makes it possible to access the original response headers and body before the redirection was followed.
    • Follow redirection consistently, regardless of whether the HTTP method was passed as a symbol or string. Under the hood rest-client now normalizes the HTTP request method to a lowercase string.

所以似乎该异常已从 rest-client 库中删除。

您可能想将其替换为 RestClient::ExceptionWithResponse