attempt & raiseLefts

실패를 Dart Stream이 가진 두 채널 사이로 옮깁니다. listen(onError:)가 보는 에러 채널, 그리고 Either를 실어 나르는 값 채널.

FxEvents<Either<E, T>> FxEvents<T>.attempt<E>(E Function(Object error, StackTrace stackTrace) onThrow) FxEvents<R> FxEvents<Either<L, R>>.raiseLefts() // L extends Object

강의

이벤트 레이어 자체의 에러 도구 — onErrorReturn, onErrorResume, retryOn, retryOnError — 는 모두 타입 없는 Object를 말합니다. 에러 채널이 그것을 나르기 때문입니다. attempt가 라이브러리의 타입 있는 절반으로 가는 다리입니다. 데이터 이벤트는 Right가 되고, 에러 이벤트는 onThrow가 만든 Left가 됩니다. 실패가 Left가 되면 컴파일러가 그 타입을 알고, 이벤트 위의 switch는 처리를 빠뜨릴 수 없습니다.

소스 경계에서 변환하고, 그 다음부터는 값 채널에 머무르세요. Dart 에러는 종결이 아니므로 소스는 구독을 유지하고 이후 이벤트도 도착합니다 — onErrorReturn이 한 번의 구조가 아니라 에러마다 대체하는 것과 같은 이유입니다. 차이는 결과 타입입니다. onErrorReturn은 자리표시자를 골라 T를 유지하고, attemptEither<E, T>로 바꿔 실패에 이름을 붙입니다.

attempt뒤에 둡니다. retryOn / retryOnError / FxEvents.retry 다음이고, 앞에는 두지 마세요. 그 연산자들은 에러 채널을 보고, 에러가 이미 값이 되면 재시도할 것이 남아 있지 않습니다.

raiseLefts는 반대 방향이며, Dart가 throw null을 할 수 없으므로 non-nullable 실패에만 있습니다. 각 Right를 풀고 각 Left를 다시 에러 채널에 올려, Dart 에러를 기대하는 Stream 코드로 넘기는 경계입니다. attempt / raiseLefts 왕복은 실패 값은 남기고 스택 트레이스는 버립니다 — Left는 트레이스를 싣지 않습니다.

데모 1 · 에러는 Left가 되고, 체인은 계속 갑니다

데모 2 · raiseLefts, 반대 방향

직접 해 보기

연습: retry 뒤의 attempt는 재시도된 실패를 변환하고, retry 앞의 attempt는 에러 채널에 재시도할 것을 남기지 않습니다.

관련 항목: onErrorReturn / onErrorResume — 에러 채널에서, 타입 없이 복구하기 · mapEither — 값 채널에 머무르기; raise는 Left가 됩니다 · Either — 이 연산자들이 감싸는 sealed 결과 타입