Обработки много исключений сетей в Ruby


Что бы быть лучший/быстрый способ сделать обработку нескольких ошибок в Ruby? Вот код, я работаю с:

begin
  response = session.get url
rescue Patron::HostResolutionError
  puts "Error resolving remote host."
  exit 1
rescue Patron::PartialFileError
  puts "File size mismatch. (Host reported a file size, but the actual file is of different size)"
  exit 1
rescue Patron::TimeoutError
  puts "Operation timed out."
  exit 1
rescue Patron::TooManyRedirects
  puts "Tried redirecting too many times."
  exit 1
rescue Patron::URLFormatError
  puts "Error with the URL format"
  exit 1
rescue Patron::UnsupportedProtocol
  puts "This URL is using a protocol that we cannot handle."
  exit 1
rescue Patron::ConnectionFailed
  puts "Error connecting to host. Check your internet connection."
  exit 1
end


Комментарии
2 ответа

Так ты спасешь всех 7 подклассов покровитель::ошибка, есть смысл напрямую спасательных покровитель::ошибка , а не спасать их по одному.

Вы также дублировать работу, которая уже проделана за вас, разработав свой собственный сообщение об ошибке для каждого исключения: исключения будут уже содержать полезные сообщения об ошибке, которое даже содержит больше информации, чем ваша (например, если узел не может быть решен, за исключением сообщений будет содержать хост, который не может быть решен, а не просто сказать "ошибка при разрешении удаленного узла").

В заключение я хотел печатать сообщения об ошибках на stderr, а не в stdout, а вот где они должны пойти.

Так что я бы написать такой код:

begin
response = session.get url
rescue Patron::Error => e
$stderr.puts e.message
exit 1
end

15
ответ дан 24 апреля 2011 в 12:04 Источник Поделиться

Начать/код спасения выглядит заезженно, но на руке было бы легко расширить в будущем. Если вы не уверены, вы всегда будете иметь эту структуру (спасения с сообщением об ошибке + выход), вы можете реферат, например:

exceptions = {
Patron::HostResolutionError => "Error resolving remote host.",
...
}

response = catch_exceptions(exceptions, :exit_code => 1) { session.get(url) }

Это обычно удобно, чтобы писать такого рода фантики, поэтому основной код остается чистым (с другой стороны, если он будет хаотичным и запутанным, это хороший знак, абстракция, просто не работает).

1
ответ дан 23 апреля 2011 в 10:04 Источник Поделиться