나는 예외를 던질 수있는 방법이(ρ)와 http4s에서 예외 처리를 추가
합니다 (Task
실패) 것을,
내 서비스
이 DAO 객체를 사용하는 (주로 자신감 통합을 위해) http4s & RHO 사용하고 있습니다 내 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 가능합니다 뭔가를하고 싶은 유사한 에러 처리로 모든 RhoRoute을 오염하지 않기 때문에,하지만 난 할 수있는, 내가 돌아 어떤 있는지 확인 '이 t은 (ρ) 작업을 얻을 것으로 보인다 :
1. 것은 기본 오류 처리기
예를 들면 만들기 추가
...
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))
}
NotImplemented이 응답하지 않기 때문에이 실패합니다 을 (내가 유형 검사 작업을하기 위해 다음에 .pure 호출 할 수 있습니다)하지만 다음 코드는 컴파일,하지만 난이 예외가 얻을 :
을EntityEncoder [fs2.Task [Product with Serializable]] 인스턴스를 찾을 수 없으므로 fs2.Task [Product with Serializable] 을 Entity로 변환 할 수 없습니다. 확인 (dao.readAll.map (_. asJson)). handleWith (ErrorHandler를) 각 RhoRoute
에
2. 추가 ErrorHandler를 rhoRoute을 정의한 후 나는 그 위에지도를하고 싶습니다 나는 아마거야, 각 경로에 ErrorHandler를 추가, 그래서이 작업을 얻을 수없는 경우 나에게 'handleWith'어딘가에 (아래 작동하지 않습니다)
new RhoService(rhoService.getRoutes.map(_.handleWith(errorHandler))
를 추가하자는 R에서 무언가를 기본 dsl로 돌아가지만, 나는 정말로 liked을 좋아했습니다