2014-10-30 10 views
1

원격 JSON/HTTP 서비스를 호출해야한다고 가정합니다. JSON 요청을 만들어 HTTP로 서버로 보내고 JSON 응답을 받고 구문 분석합니다.스칼라에서 오류 처리의 오류 컨텍스트

한다고 가정 내가 오류에 대한 데이터 유형 MyError이 내 모든 기능을 Either[MyError, R]

type Result[A] = Either[MyError, A]  

def makeJsonRequest(requestData: RequestData): Result[String] = ... 

def invoke(url: URL, jsonRequest: String): Result[String] = ... 

def parseJsonResponse(jsonResponse: String): Result[ResponseData] = ... 

나는 새로운 기능 쓰기를 결합 할 수 있습니다 반환 :

def invokeService(url: URL, requestData: RequestData) Result[ResponseData] = for { 
    jsonRequest <- makeJsonRequest(requestData).right 
    jsonResponse <- invoke(url, req).right 
    responseData <- parseJsonResponse(jsonResponse).right 
} yield responseData 

지금 parseJsonResponse 실패 어떤 경우입니까?

오류가 발생하지만 전체 도 필요합니다. 즉 url, requestDatajsonRequest이 필요합니다. 내가 그걸 어떻게하라고 제안 했니?

+0

정확히 무엇을 묻고 있는지 잘 모르겠지만, 왼쪽의 부분을 '.left.map (...)'로 매핑 할 수 있습니다. –

+0

제안 해 주셔서 감사합니다. 나는 그것에 대해 다른 질문을하려고 노력할 것이다. – Michael

답변

2

이 경우 특정 경우에 MyError을 특성 (ADT)으로 만들고 가능한 값 중 하나가 JsonParsingFailed(jsonRequest, ...)이되도록 허용합니다.

더 일반적인 경우라면 모든 단계에서 Writer (또는 type MyWriter[A] = Writer[Vector[MyLogEntry], A])을 사용하여 EitherT[MyWriter, MyError, A]을 사용하여 "이벤트를 기록"할 수 있습니다.

+0

감사합니다. 일반 솔루션에 더 관심이 있습니다. 그러나 나는 "실행 컨텍스트"(즉, 범위의 변수)를 로그에 기록하는 대신 메모리에 저장하는 것을 선호합니다. – Michael

+0

당신은 - Writer는 당신이 다른 것을하기 전까지는 메모리에 데이터를 저장합니다. 슬프게도 나는 "모든 것을 범위에 저장"하는 일반적인 방법이 없다고 생각합니다. 수동으로 중요한 것을 포착해야합니다. – lmm

+0

알 수 있습니다. 다시 한번 감사드립니다. 아마도이 질문을 다시 말하면 더 명확하게 할 수 있습니다 (그리고 더 많은 답변을 얻을 수 있습니다 :)) – Michael

관련 문제