2017-09-26 4 views
0

나는 예외를 던질 수있는 방법이(ρ)와 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을 좋아했습니다

답변

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)) 
    } 

작동합니다. 모든 도움을 환영합니다 :-)

관련 문제