Исключение перехватывается только с помощью `rescue` в конце строки, но не при использовании блока `begin Rescue`

У меня есть утверждение, которое терпит неудачу:

result = service.load_data()

Теперь следующее подавляет ошибку, и я могу проверить nil

result = service.load_data() rescue nil

Но когда я делаю следующее, первоначальная ошибка возникает прямо в пользовательском интерфейсе, и я не получаю details исключения.

begin
   result = service.load_data()
rescue => details         
   logger.fatal "Failed to load the data: #{details}"
end

Я уверен, что есть глупая деталь, которую я должен упустить, но я не могу найти здесь проблему. Так почему же не вызывается блок rescue?

Обновление: я получил следующее сообщение об ошибке:

getaddrinfo: nodename nor servname provided, or not known

person Besi    schedule 24.04.2013    source источник
comment
Какая ошибка происходит?   -  person Sergio Tulentsev    schedule 24.04.2013
comment
@SergioTulentsev getaddrinfo: nodename nor servname provided, or not known (я обновил свой ответ)   -  person Besi    schedule 24.04.2013
comment
Проверьте написание слова «спасение» (в вашем посте есть слово «спасение»).   -  person Bob Jarvis - Reinstate Monica    schedule 24.04.2013
comment
Вы все еще не предоставили класс исключения, но для тех, кто пытается помочь, это, вероятно, SocketError   -  person Lee Jarvis    schedule 24.04.2013
comment
Кроме того, использование rescue без класса по умолчанию будет StandardError, если ваш класс исключений не наследуется от него, произойдет сбой. Вам может понадобиться rescue Exception или указать классы более конкретно. Тем не менее, если это /is/SocketError, это наследуется от StandardError, поэтому ваш код должен работать как есть.   -  person Lee Jarvis    schedule 24.04.2013
comment
@BobJarvis хороший улов. Я исправил это. Однако у меня не было этой опечатки в коде.   -  person Besi    schedule 24.04.2013
comment
Хорошо, ответ Прити помог. Я не знаю, почему меня минусуют. Я нахожу немного странным, что rescue в конце строки в этом случае улавливает исключение, но при использовании в качестве блока это не так, если вы не укажете тип исключения.   -  person Besi    schedule 25.04.2013


Ответы (1)


begin
   result = service.load_data()
rescue AnExceptionKlass => details    # here the name is SocketError    
   logger.fatal "Failed to load the data: #{details}"
end

используйте вышеизложенное.

попытался воспроизвести ошибку, как показано ниже:

require 'net/http'
Net::HTTP.start('http://www.google.com') do |http|
response = http.get('/')
puts response
end
#=> getaddrinfo: No such host is known.  (SocketError)

Исправлено, как показано ниже:

require 'net/http'

begin

  htt = Net::HTTP.start('http://www.google.com')
  response = htt.get('/')
  puts response

rescue SocketError => details    # or the Exception class name may be SocketError    
   p "Failed to load the data: #{details}"
end

#=> "Failed to load the data: getaddrinfo: No such host is known. "
person Arup Rakshit    schedule 24.04.2013
comment
НИКОГДА rescue Exception => e Даже не предлагайте это в качестве примера. stackoverflow.com/questions/10048173/ - person nitsujri; 22.10.2015
comment
@nitsujri Вы полностью прочитали ответ? Вы читали комментарии, которые я дал. Ну давай же!! - person Arup Rakshit; 22.10.2015