2017-05-02 19 views
0

は、私が試したとき: Yesodハンドラ内で例外を「キャッチ」するにはどうすればよいですか?

foos <- (return $ map (encode .> cs .> jsonToFoo body) `catch` r400 

は、私は、次のタイプのエラーを得た:

/path/to/File.hs:47:78: error: 
    • Couldn't match type ‘(->) e0’ with ‘IO’ 
     arising from a functional dependency between: 
      constraint ‘MonadBase IO ((->) e0)’ arising from a use of ‘r400’ 
      instance ‘MonadBase ((->) r) ((->) r)’ at <no location info> 
    • In the second argument of ‘catch’, namely ‘r400’ 
     In a stmt of a 'do' block: 
     foos <- (return $ map (encode .> cs .> jsonToFoo) body) 
       `catch` r400 
     In the expression: 
     do { (body :: [Value]) <- requireJsonBody; 
      foos <- (return $ map (encode .> cs .> jsonToFoo) body) 
        `catch` r400; 
      .... } 

方法があれば、それはliftIOが、それは、ありません必要?

+0

[持ち上げたベースパッケージから[catch]のバージョンを使用してください](https://hackage.haskell.org/package/lifted-base-0.2.3.10/docs/Control-Exception-Lifted.html# v:キャッチ)。 –

+0

@AlexisKingありがとう、それを試してみてください。 – Wizek

+0

@AlexisKing私はまったく同じ型エラーを受け取りました: '型にマッチできませんでした '( - >)e0' with 'IO'' – Wizek

答えて

2

私はちょうどcatchの引数がありませんでした:

foos <- (return $ map (encode .> cs .> jsonToFoo body) 
    `catch` (\(e :: SomeException) -> r400) 

それは型エラーから私のために、より明らかではなかったのが残念。

関連する問題