Другой подход состоит в том, чтобы объединить все эти исключения в константу, а затем повторно использовать эту константу, например ::
.
ALL_NET_HTTP_ERRORS = [
Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError,
Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError
]
begin
your_http_logic()
rescue *ALL_NET_HTTP_ERRORS
…
end
Гораздо проще в обслуживании и чистоте.
Однако, слово предупреждения. Я скопировал список возможных исключений из вышеупомянутого сообщения в блоге Таммера Салеха, и я знаю, что его список неполон. Например, Net::HTTP.get(URI("wow"))
повышает Errno::ECONNREFUSED
, которого нет в списке. Кроме того, я не удивлюсь, если список будет изменен для разных версий Ruby.
По этой причине я рекомендую придерживаться rescue StandardError
в большинстве случаев. Чтобы избежать слишком большого перехвата, перемещайтесь как можно дальше за пределы блока begin-rescue-end, предпочтительно оставляйте только вызов одному из Net::HTTP
методов.