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