Как бороться с незнанием того, какие исключения могут быть вызваны библиотечным методом в Ruby?
Это довольно широкий вопрос, но я продолжаю сталкиваться с ним при программировании на Ruby. Я в основном из C и Java, где, когда я использую библиотечную функцию или метод, я просматриваю документацию и вижу, что она возвращает при ошибке (обычно в C) или какие исключения она может генерировать (в Java).
В Ruby ситуация выглядит совершенно иначе. Просто сейчас мне нужно проанализировать некоторые JSON, которые я получаю с сервера:
data = JSON.parse(response)
Естественно, первое, что я думаю после написания этого кода, это что, если ввод плохой? Являетсяparse
собирается вернуть ноль в случае ошибки или вызвать какое-то исключение, и если да, то какие?
Я проверяю документацию (http://flori.github.com/json/doc/JSON.html#M000022) и видите, просто:
«Разобрать источник строк JSON в структуру данных Ruby и вернуть ее».
Это всего лишь пример шаблона, с которым я неоднократно сталкивался в Ruby. Первоначально я полагал, что это был какой-то недостаток документации любой библиотеки, с которой я работал, но теперь я начинаю чувствовать, что это стандартная практика, и у меня несколько иное мышление, чем у программистов на Ruby. Есть какое-то соглашение, о котором я не знаю?
Как разработчики справляются с этим?
(И да, я посмотрел на код метода библиотеки и смог получить представление о том, какие исключения возникают, но я не могу быть уверен на 100%, и если это не задокументировано, мне неудобно полагаться на него.)
РЕДАКТИРОВАТЬПосмотрев на первые два ответа, позвольте мне продолжить пример синтаксического анализа 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
просматривая код и тесты?
(Я также отредактировал пример, чтобы уточнить, что это ответ сервера, который я анализирую.)