2017-11-08 7 views
1

モダードトランスExceptTを使ってIO Monadをラップします。どのようにhaskell catch throwIO例外をExceptTで呼び出す

この例外は、外側 Exceptionでキャッチしたと例えば1

へとEither e aタイプ変換ので、どのように

、その後、内部IOモナドでthrowIO e

私のプログラムのタイプを定義します

newtype HandlerT ea = HandlerT {RunHandlerT :: ExceptT e(ReaderT(IO a))

次に、内部IOモナドでHTTPリクエストにアクセスして存在しないWebサイトがあると、無意味なhttp.LBSはコールのthrowIOによって例外をスローします。

その後、

runExceptT $ runReaderT $ runHandlerT (http.LBS "http://notexist.com") 

は、eは、内部呼び出しが投げる例外を持ってEither e a

を返します。

答えて

1

あなたはsafe-exceptionsパッケージ(のチュートリアル:https://haskell-lang.org/library/safe-exceptions)使用できる2つの方法でここに役立つ機能のセットを提供し、:彼らはExceptTなど、さまざまなモナドで動作するように持ち上げられて

  1. をし、 ReaderTHandlerTの場合はMonadThrowMonadCatchのインスタンスを取得する必要があります。
  2. catchAnytryAny関数を使用して、すべての同期例外をキャッチすることができます。これはおそらくここで必要なものです。 (非同期対同期の詳細については、リンクのチュートリアルを参照してください。)

言った:

liftIO (tryAny (httpLBS req)) 
httpLBS機能が IO自身の生活(最も可能性が高い)であることを考えると、あなたはまた、のような何かを行うことができます

となり、モナド・トランスの実行時例外をまったく気にする必要はありません。

関連する問題