обрабатывать с SomeException игнорируется - PullRequest
4 голосов
/ 23 апреля 2019

У меня есть обычный код haskell, который читает файл и обрабатывает любое исключение:

handle ((\_->return "ERROR") :: SomeException -> IO String) $ readFile "file.txt"

Когда я пытаюсь прочитать неверно закодированный файл, я всегда получаю сообщение об ошибке:

*** Exception: file.txt: hGetContents: invalid argument (invalid byte sequence)

и программане собирается входить в мою функцию дескриптора исключения.Я также попытался использовать типы IOError и IOException вместо SomeException, но это ничего не меняет.

Если я открою аналогичный файл с помощью дескриптора и прочту его с кодом:

handle ((\_->return "ERROR") :: SomeException -> IO String) (hGetContents myHandle)

отлично работает.

Как отловить исключения, выданные hGetContents, переданные readFile в правильном направлении?

1 Ответ

5 голосов
/ 23 апреля 2019

Вы можете принудительно прочитать всю строку в пределах области действия catch:

Control.Exception.handle
      ((\_ -> return "ERR") :: Control.Exception.SomeException -> IO String)
      (Prelude.readFile "file.txt" >>= \res -> res `deepseq` (pure res))
"ERR"
...