私は例外を投げることができる方法がローと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が好きでした