2014-10-30 52 views
1

假設我需要調用遠程JSON/HTTP服務。我做了一個JSON請求,通過HTTP發送給服務器,並接收和解析JSON響應。Scala錯誤處理中的錯誤上下文

假設我有錯誤的數據類型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(...)'在左邊的任何一個上映射。 – 2014-10-30 19:04:48

+0

感謝您的建議。我會試着就此提出另一個問題。 – Michael 2014-10-31 16:34:37

回答

2

如果這是一個特定的情況,我會使MyError成爲特質(ADT),並允許其中一個可能的值爲JsonParsingFailed(jsonRequest, ...)

如果它的東西更通用的我可能會使用Writer(或者說type MyWriter[A] = Writer[Vector[MyLogEntry], A],然後使用EitherT[MyWriter, MyError, A])在每一個階段,以「記錄事件」。

+0

謝謝。我對通用解決方案更感興趣。不過,我寧願將「執行上下文」(即範圍中的變量)存儲在內存中,而不是將它們寫入日誌。 – Michael 2014-10-30 18:36:20

+0

你是 - 'Writer'將數據存儲在內存中,除非你直到你做了別的事情。可悲的是我不認爲有一種通用的方式來存儲「範圍內的一切」,你必須手動捕獲重要的東西。 – lmm 2014-10-31 12:07:48

+0

明白了。再次感謝。我可能會重新說出這個問題,使其更清楚(並獲得更多回復:)) – Michael 2014-10-31 12:11:07