2014-10-30 2 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, requestData и jsonRequest. Как бы вы предложили мне сделать это?

+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

Смежные вопросы