在错误斯卡拉处理错误上下文(Error context in error handling in S

2019-10-21 05:30发布

假设我需要调用一个远程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失败了呢?

我得到的错误,但我还需要整个环境 。 这就是我需要的urlrequestDatajsonRequest 。 你会如何建议我做吗?

Answer 1:

如果这是一个特定的情况下,我会做MyError为特征(ADT),并允许一个可能值被JsonParsingFailed(jsonRequest, ...)

如果它的东西更通用的我可能会使用Writer (或者更确切地说, type MyWriter[A] = Writer[Vector[MyLogEntry], A]然后用EitherT[MyWriter, MyError, A]在每一个阶段“记录事件”。



文章来源: Error context in error handling in Scala