【问题标题】:Error context in error handling in ScalaScala中错误处理中的错误上下文
【发布时间】:2014-10-31 01:32:49
【问题描述】:

假设我需要调用远程 JSON/HTTP 服务。我发出一个 JSON 请求,通过 HTTP 将其发送到服务器,然后接收并解析 JSON 响应。

假设我的数据类型为 MyErrorfor 错误并且我的所有函数都返回 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。你会建议我怎么做?

【问题讨论】:

  • 不确定我是否完全理解您的要求,但您可以使用 .left.map(...) 映射到两者的左侧。
  • 感谢您的建议。我会试着问另一个问题。

标签: scala error-handling either


【解决方案1】:

如果这是一种特殊情况,我会将MyError 设为特征 (ADT),并允许其中一个可能的值为 JsonParsingFailed(jsonRequest, ...)

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

【讨论】:

  • 谢谢。我对通用解决方案更感兴趣。但是,我更愿意将“执行上下文”(即作用域中的变量)存储在内存中,而不是将它们写入日志。
  • 你是 - Writer 将数据存储在内存中,除非并且直到你用它做其他事情。遗憾的是,我认为没有一种通用的方式来存储“范围内的所有内容”,您必须手动捕获重要的内容。
  • 知道了。再次感谢。我可能会重新表述这个问题以使其更清楚(并获得更多回复:))
猜你喜欢
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2020-10-04
  • 2018-05-14
  • 1970-01-01
  • 2021-04-06
相关资源
最近更新 更多