5

ファイルから値を読み取って、発生する可能性のあるすべての例外をキャッチしようとしています ( 「許可よりも許しを求める方が簡単」という考え方で)。Prelude.read: no parseただし、例外をキャッチするのに問題があります。私の知る限り、すべての例外の「スーパータイプ」である明示的な型でtry定義したすべての例外をキャッチする必要があることを伝えるには:tryAnySomeException

import Control.Exception (try,SomeException)
tryAny :: IO a -> IO (Either SomeException a)
tryAny = try

IOエラーをtryAnyキャッチできるようです:

> tryAny (fromFile "nonExistingFileName")
Left nonExistingFileName: openFile: does not exist (No such file or directory)

ただし、読み取りエラーはキャッチされません。

> tryAny (return ((read "a")::Int))
Right *** Exception: Prelude.read: no parse

すべての例外をキャッチするにはどうすればよいですか?

4

4 に答える 4

1

readMaybe私は同じ問題を抱えていて、いくつかのコメントで提案されているように見つかりませんでした。しかし、私の問題を解決する別の便利な読み取りバリエーションを見つけました-readIO

readIO 関数は read に似ていますが、プログラムを終了する代わりに IO モナドに解析の失敗を通知する点が異なります。

それを使用して、プログラム内のすべてのエラーをキャッチして処理することができました。

于 2015-04-25T22:46:51.757 に答える