В целом исключения должны использоваться для исключительных событий. Нестандартный поток приложения.
При отлове исключений всегда указывайте c и спасайте только те исключения, с которыми вы знаете, что делать.
begin
pats "hello world"
rescue
nil
end
В этом примере показан серьезный недостаток кода в вашем вопросе - вы создали черную дыру, которая поглощает ошибку NoMethodError, которая могла бы сказать нам, что в коде есть опечатка. Это делает отладку чрезвычайно сложной. Этот анти-шаблон известен как обработка исключений покемонов (должен поймать их всех).
ensure
просто гарантирует, что код будет запущен независимо от того, вызвал ли код исключение или нет. Он используется, например, для гарантии того, что метод закрывает обработчик файла, который он открыл, или откатывает транзакцию. Это действительно большой молот, который следует использовать очень экономно.
HTTParty на самом деле не вызывает исключений, когда код ответа является кодом "ошибки" - потому что это не исключительное событие. Это часть нормального потока приложений при работе с HTTP-запросами. Дерьмо случается. HTTParty вызывает исключения, если вы вообще не можете подключиться к серверу или даже не можете добраться до сети Это исключительные события.
class GeolocationClient
include HTTParty
base_uri "https://www.googleapis.com/geolocation/v1"
format :json
attr_accessor :options
def initialize(api_key:)
@options = {
api_key: api_key
}
end
def geolocate
begin
response = self.class.get("/geolocate", options)
if response.successful?
response
else
logger.info("Geolocation API call was unsuccessful. Status code: #{response.code}")
handle_unsuccessful_request
end
rescue HTTParty::Error => e
logger.warn(e.message)
handle_unsuccessful_request
end
end
private
def handle_unsuccessful_request
{ "message" : "unable to find location" }
end
end
response.successful?
проверяет, находится ли ответ в 2xx
«счастливом диапазоне». Используйте оператор switch, если вы хотите обрабатывать каждый код или диапазон кодов отдельно.