Как узнать, какие исключения могут быть выброшены в Haskell? - PullRequest
3 голосов
/ 23 мая 2019

При недавнем использовании wreq я написал код, который компилировался и работал некоторое время. Затем был брошен HttpException. HttpException не определено в wreq. Я должен был отследить его до http-client. Затем, через некоторое время снова, JSONError был брошен. Это также не определено в wreq, но в aeson.

Как узнать, какие возможные исключения могут быть выброшены из библиотеки черного ящика, кроме как для чтения всей доступной документации для этой библиотеки и, возможно, всех зависимых библиотек, надеясь, что авторы упомянули об этом?

1 Ответ

1 голос
/ 24 мая 2019

В Haskell нет средств для определения того, какие исключения времени выполнения может выдать функция.

Если вы пришли из Java с ее «проверенными» и «непроверенными» исключениями, то вы должны считать все исключения среды выполнения Haskell непроверенными. Эквивалент проверенных исключений в Haskell обычно включает их в тип результата, используя Maybe, Either, ExceptT или что-то подобное, как указано в комментариях.

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

В этом случае документация для wreq очень ясно дает понять, что HttpException и JSONError могут быть выброшены, но нет никакой гарантии, что документация для этой или любой другой библиотеки является правильной / полной или что зависимые библиотеки не будет выбрасывать другие исключения, которые не перечислены. (Примечание: JSONError фактически определено в wreq. Пакет aeson не использует исключения для сигнализации ошибок декодирования JSON.)

В рабочем коде вам нужно убедиться, что у вас есть соответствующий обработчик «все исключения».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...