2017-09-26 4 views
0

私は例外を投げることができる方法がローとhttp4sに例外処理を追加

Taskを不合格)という、

マイサービス

このDAOオブジェクトを使用している(主に闊歩統合のために)http4s &ロー使用しています私RhoServiceで

case class BasicMatchDao() { 
def readAll(): Task[List[BasicMatch]] = Task.fail(ActionNotImplemented("readAll")) 
def read(id: String): Task[Option[BasicMatch]] = readQuery(id).option.transact(xa) 
} 
私は

private def exceptionToJson(t: Throwable):Json = Json.obj("error" -> t.getMessage.asJson) 

val rhoService = new RhoService { 
    GET/path |>> { (request: Request) => 
    Ok(dao.readAll.map(_.asJson)).handleWith { 
     case t:ActionNotImplemented => NotImplemented(exceptionToJson(t)) 
     case t:Throwable => InternalServerError(exceptionToJson(t)) 
    } 
} 

この方法のようにこれらを処理することができます私は、それはいつもだJSON

私はデフォルトのhttp4s.dslで可能である何かをしたいと類似errorhandlingておきRhoRouteを汚染したくないので、私がすることができます、私は返すどんなことを確認してください「Tは、Rhoでの作業を取得するように見える:

1.デフォルトのエラーハンドラ

などを作成します。

:NotImplementedが応答ではありませんので、これは (私は仕事を型チェックを行うために、これらの上.pureを呼び出すことができます)失敗します。しかし、その後のコードがコンパイルされますが、私はこの例外を取得

... 
Ok(dao.readAll.map(_.asJson)).handleWith(errorHandler) 
... 

private def errorHandler(): PartialFunction[Throwable, Task[Response]] = { 
     case t:ActionNotImplemented => NotImplemented(exceptionToJson(t)) 
     case t:Throwable => InternalServerError(exceptionToJson(t)) 
} 

を追加

EntityEncoder [fs2.Task [Product with Serializable]]インスタンスが見つかりませんでしたので、fs2.Task [Product with Serializable] をエンティティに変換できません。 OK(dao.readAll.map(_。asJson))。handleWith(ErrorHandlerの)各RhoRoute

2.追加のErrorHandler rhoRouteを定義した後、私はその上にマッピングしたいのですがそして、私はおそらくよ、各ルートにのErrorHandlerを追加するので、私はこの仕事を得ることができない場合、私は「handleWith」どこか(下記動作しません)

new RhoService(rhoService.getRoutes.map(_.handleWith(errorHandler)) 

を追加してみましょうrでの何かをしますデフォルトのDSLに戻りますが、私は本当にrhoが好きでした

答えて

0

だから、パート1は現在修正されています。 Task[BaseResult]代わりのTask[Response]としてタスクを定義することは私もパート2に探してい

import org.http4s.rho.Result.BaseResult 

val errorHandler: PartialFunction[Throwable, Task[BaseResult]] = { 
    case t:ActionNotImplemented => NotImplemented(exceptionToJson(t)) 
    case t:Throwable => InternalServerError(exceptionToJson(t)) 
    } 

動作します。すべてのヘルプは大歓迎です:-)