Это несколько широкий вопрос, но я всегда сталкиваюсь с программированием в 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
, просмотрев код и тесты?
(Я также отредактировал пример, чтобы уточнить, что это ответ от сервера, который я обрабатываю.)