Как я могу поймать Zlib::BufError в моем коде Ruby on Rails?

Я создал приложение с Rails. У меня есть большой список адресов, которые я стандартизирую через API Bing/Google с помощью Geocoder. Это мой текущий вызов для получения информации об адресе:

Geocoder.search(address)

Это отлично работает, и я могу разобрать ответ JSON. Однако, когда я оставляю скрипт запущенным, он иногда падает со следующей ошибкой:

Zlib::BufError: buffer error

Вместо того, чтобы сценарий упал, я хотел бы поймать эту ошибку и продолжить работу со сценарием. Как я мог сделать это с Руби? Я не уверен, какое исключение поймать, если таковое имеется.


person Arthur    schedule 30.09.2015    source источник
comment
Что значит, ты не знаешь исключения? Zlib::BufError является исключением.   -  person Sergio Tulentsev    schedule 30.09.2015
comment
Я попытался спасти Zlib::BufError, и он продолжает говорить мне, что это неизвестная ошибка. Я думал, что это тоже будет, но получаю эту неизвестную ошибку. Я попробую еще раз и посмотрю, почему это может быть. Спасибо за ответ.   -  person Arthur    schedule 30.09.2015
comment
что значит неизвестная ошибка?   -  person Sergio Tulentsev    schedule 30.09.2015
comment
У меня нет точного сообщения, но оно было похоже на неопределенное исключение zlib:buferror. Я мог что-то опечатать. Я добавил начало спасения обратно и посмотрю, что произойдет.   -  person Arthur    schedule 30.09.2015
comment
Здесь что-то не так. Это отчет о Z_BUF_ERROR, возвращаемом zlib. Это означает, что этот конкретный вызов inflate() или deflate() не мог добиться какого-либо прогресса из-за отсутствия каких-либо входных данных или отсутствия выходного пространства. Эта ошибка не является фатальной. Вы всегда можете продолжить, предоставив больше входных или выходных данных. Поэтому что-то должно продолжаться, и вы не должны получать эту ошибку, если только она не используется для указания чего-то другого. Например. декодируется неполный поток zlib.   -  person Mark Adler    schedule 01.10.2015
comment
Да. Я извлекаю JSON из API геокодирования bing, и время от времени он выдавал эту ошибку, возможно, тайм-аут или не получение всех данных, мое интернет-соединение очень нестабильное. Как упоминалось ранее, я пытался спасти ZLib::BufError, но по какой-то причине мне нужно было включить zlib. Ответ ниже.   -  person Arthur    schedule 01.10.2015


Ответы (1)


Чтобы убедиться, что Zlib доступен, вам нужно require 'zlib' в файле, где вы хотите перехватить ошибку. Не похоже, чтобы Geocoder где-либо объявил это как саму зависимость, поэтому она может не загружаться при оценке вашей строки rescue.

require 'zlib'

begin
  Geocoder.search('110 William St, 28th Floor New York, NY 10038')
rescue Zlib::BufError => boom
  puts 'Stack Overflow appears to have moved.'
end
person Kristján    schedule 30.09.2015
comment
Это было оно. Спасибо! - person Arthur; 30.09.2015