attempt & raiseLefts
실패를 Dart Stream이 가진 두 채널 사이로 옮깁니다. listen(onError:)가 보는 에러 채널, 그리고 Either를 실어 나르는 값 채널.
강의
이벤트 레이어 자체의 에러 도구 —
onErrorReturn,
onErrorResume,
retryOn,
retryOnError — 는 모두 타입 없는
Object를 말합니다. 에러 채널이 그것을 나르기
때문입니다. attempt가 라이브러리의 타입 있는
절반으로 가는 다리입니다. 데이터 이벤트는 Right가
되고, 에러 이벤트는 onThrow가 만든
Left가 됩니다. 실패가 Left가 되면
컴파일러가 그 타입을 알고, 이벤트 위의
switch는 처리를 빠뜨릴 수 없습니다.
소스 경계에서 변환하고, 그 다음부터는 값 채널에 머무르세요.
Dart 에러는 종결이 아니므로 소스는 구독을 유지하고 이후
이벤트도 도착합니다 — onErrorReturn이 한 번의
구조가 아니라 에러마다 대체하는 것과 같은
이유입니다. 차이는 결과 타입입니다.
onErrorReturn은 자리표시자를 골라 T를
유지하고, attempt는
Either<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 결과 타입