TL; DR
Вы можете передавать исключения с помощью некоторого рефакторинга, но я использую здесь подход к рассмотрению передачи исключений как анти-паттерна для ожидаемого (но не обязательно желательно ) результаты. Если вам действительно нужны накладные расходы для обхода исключений, другие ответы, скорее всего, дадут вам советы о том, как это сделать с помощью замыканий или рефакторинга стека вызовов.
Анализ и рекомендации
Конечно, есть способы обойти исключения, но здесь есть большая проблема, а именно использование исключения для обработки неисключительного варианта использования. Исключения должны быть ... ну, исключительные . Вызов HTTP, который возвращает код состояния, отличный от 200, обычно не является совершенно неожиданным результатом. На самом деле, ваш код специально проверяет это состояние, так что на самом деле это ожидаемый путь кода в вашем приложении.
Однако обратите внимание, что проверка «not 200 OK» не на самом деле то же самое, что явная проверка на 401 Несанкционированный. В таких случаях обработка ожидаемого условия как такового, как правило, быстрее и менее подвержена ошибкам, чем возбуждение или обход исключений.
Один из способов решения этой проблемы (но, конечно, не единственный) - это рефакторинг приложения для обработки разные ожидаемые результаты разумно. Например:
def conn
response = conn.post
# Pass through 200; handle everything else.
case response.status
when 200
when 401 then handle_auth_error(response)
when 403 then handle_forbidden_error(response)
else raise "unexpected HTTP status code: #{response.status}"
end
parse_response(response)
end
Смысл этого состоит не столько в встраивании logi c в #conn; безусловно, стоит извлечь его другим способом. Суть в том, что вы должны оставлять исключения для непредвиденных / необработанных ошибок , которые не могут быть обработаны в работающем приложении.
В этом примере мы создаем исключение только для кодов состояния, которые мы не ожидал. Это приводит к гораздо более простому решению и, вероятно, более надежному приложению.