2016-09-10 45 views
0

У меня есть много ошибок, которые мне нужно поймать, поэтому я помещал их все в два массива и делал константу, чтобы их удерживать, однако, когда я запускаю программу, я получаю исключение:Использование splat для улавливания ошибок не работает

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 ([email protected])', 
    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 stackoverflow.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] 
+0

По ошибке, вам нужно проверить линию 'от whitewidow.rb: 6: в«require_relative'', что это требует? –

+0

@BlueSmith для этого требуется файл с требованиями, классами, модулями и константами –

ответ

1

Я установил mechanize и rest-client

gem install mechanize gem install rest-client

затем я открыл IRB сессию

require mechanize require rest-client

затем проверил ваш массив FATAL_ERROR и смог поднять ошибку и обработать ее с помощью вашего кода.

Таким образом, нет проблем с тем, как вы используете оператор splash *.

Проблема в вашем массиве LOADING_ERRORS.

Когда я попытался сделать то же самое с вашим массивом LOADING_ERRORS, я получил то же сообщение об ошибке, что и вы.

Я клонировал репозиторий git rest-client и искал в файле lib/restclient/exceptions.rb, и похоже, что нет RestClient::MaxRedirectsReached.

Если вы удалите это исключение из своего массива, код работает.

После дальнейших исследований в хранилище, есть history.md файл и в нем говорится:

  • Изменения перенаправления поведение: (# 381, # 484)
    • Удалить RestClient::MaxRedirectsReached в пользу нормальные ExceptionWithResponse подклассы. Это делает ответ доступным на объекте исключения как .response, что позволяет абонентам рассказать , что действительно произошло, когда достигнут предел переадресации.
    • При последующем перенастройке HTTP сохраните список каждого предыдущего ответа на объект ответа как .history.Это позволяет получить доступ к исходным заголовкам и корпусу до того, как было выполнено перенаправление.
    • Следуйте за перенастройкой последовательно, независимо от того, прошел ли метод HTTP как символ или строка. Под капотом rest-client теперь нормализует метод HTTP-запроса для строчной строки.

Так что похоже, что исключение было удалено из rest-client библиотеки.

Вы можете заменить его RestClient::ExceptionWithResponse

+1

Да, я буду проклят, он работает. Спасибо! –

+1

Две ноты: 1. Исключение 'RestClient :: ExceptionWithResponse' - это родительский класс для многих исключений, которые вызывает« rest-client », нет необходимости перечислять их все. 2. Смутно, 'rest_client' на самом деле другой камень, устаревшая вилка. https://rubygems.org/gems/rest_client https://rubygems.org/gems/rest-client – alberge