Scala中错误处理中的错误上下文

Scala中错误处理中的错误上下文,scala,error-handling,either,Scala,Error Handling,Either,假设我需要调用远程JSON/HTTP服务。我发出一个JSON请求,通过HTTP将其发送到服务器,然后接收并解析JSON响应 假设我的错误数据类型为MyError,所有函数返回或[MyError,R] type Result[A] = Either[MyError, A] def makeJsonRequest(requestData: RequestData): Result[String] = ... def invoke(url: URL, jsonRequest: String

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

假设我的错误数据类型为
MyError
,所有函数返回
或[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
def invokeService(url:url,requestData:requestData)结果[ResponseData]=for{

jsonRequest如果这是一个特定的情况,我会将
MyError
转换成一个trait(ADT),并允许其中一个可能的值为
jsonparsingfiled(jsonRequest,…)


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

谢谢。我对通用解决方案更感兴趣。不过我更喜欢存储“执行上下文”(即作用域中的变量)存储在内存中,而不是将它们写入日志。您是-
Writer
将数据存储在内存中,除非您对其执行其他操作。遗憾的是,我认为没有一种通用的方法来存储“作用域中的所有内容”,您必须手动捕获重要内容。明白了。再次感谢。我可能会重新表述此问题以使其更清楚(并获得更多答复:))不确定我是否完全理解您的问题,但您可以使用
.left.map(…)在任一问题的左侧进行映射
。谢谢你的建议。我会试着问另一个问题。