Подтвердить что ты не робот

Как бороться с тем, чтобы не знать, какие исключения могут быть вызваны библиотечным методом в Ruby?

Это несколько широкий вопрос, но я всегда сталкиваюсь с программированием в Ruby. Я в основном из C и Java-фона, где, когда я использую библиотечную функцию или метод, я просматриваю документацию и вижу, что она возвращает при ошибке (обычно в C) или какие исключения она может вызывать (в Java).

В Ruby ситуация кажется совершенно другой. Только сейчас мне нужно разобрать некоторый JSON, который я получаю с сервера:

data = JSON.parse(response)

Естественно, первое, что я думаю после написания этого кода, - что, если вход плохой? Является ли parse возвращением nil на ошибку или вызывает какое-то исключение, и если да, то какие?

Я проверяю документацию (http://flori.github.com/json/doc/JSON.html#M000022) и просто:

"Разделите источник строки JSON в структуру данных Ruby и верните ее".

Это всего лишь пример шаблона, который я неоднократно повторял в Ruby. Первоначально я полагал, что это был некоторый недостаток документации какой-либо библиотеки, с которой я работал, но теперь я начинаю ощущать, что это стандартная практика, и я немного иной, чем программисты Ruby. Есть ли какое-то соглашение, о котором я не знаю?

Как разработчики справляются с этим?

(И да, я просмотрел код метода библиотеки и могу получить представление о том, какие исключения были подняты, но я не могу быть на 100% уверенным, и если он не документирован, я чувствую себя неудобно, полагаясь на него.)

EDIT: рассмотрев первые два ответа, позвольте мне продолжить пример синтаксического анализа JSON сверху.

Я подозреваю, что не должен делать:

begin
  data = JSON.parse(response)
  raise "parse error" if data.nil?
rescue Exception => e
  # blahblah
end

потому что я могу посмотреть на код/​​тесты и увидеть, что он вызывает ошибку ParserError при ошибке (возвращаемое значение nil не является стандартной практикой в ​​Ruby). Правильно ли я сказал бы, что рекомендуемая практика:

begin
  data = JSON.parse(response)
rescue JSON::ParserError => e
  # blahblah
end

... на основе того, что я узнал о ParserError, просмотрев код и тесты?

(Я также отредактировал пример, чтобы уточнить, что это ответ от сервера, который я обрабатываю.)

4b9b3361

Ответ 1

(И да, я просмотрел код метода библиотеки и могу получить представление о том, какие исключения были подняты, но я не могу быть на 100% уверенным, и если он не документирован, я чувствую себя неудобно, полагаясь на него.)

Я предлагаю взглянуть на тесты, поскольку они покажут некоторые "вероятные" сценарии и то, что может быть поднято. Не забывайте, что хорошие тесты также являются документацией.

Ответ 2

Я предполагаю, что если документация не предоставлена, вы должны полагаться на что-то вроде этого:

begin
   # code goes here
rescue
   # fail reason is in $!
end

Ответ 3

Если вы хотите отменить недействительные данные JSON:

begin
  res = JSON.parse(string)
rescue JSON::ParserError => e
  # string was not valid
end

Ответ 4

Вы никогда не можете быть уверены, какие исключения могут быть подняты, если только код библиотеки не поймает все, а затем их обертывает. Лучше всего использовать хороший ввод кода, дезактивируя то, что происходит, а затем используйте собственную обработку исключений для более высокого уровня, чтобы ломать неудачный ввод с ваших входов.