C.W.K.
Stream
Lesson 03 of 04 · published

전부-아니면-에러: 절대 조용한 텍스트 전용 없음

~11 min · failure-handling, all-or-error, no-silent-downgrade, honesty

Level 0신호 없음
0 XP0/32 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"이미지를 못 보내면, 그거 없이 질문을 조용히 보내지 마. 그림을 잃은 질문은 다른, 틀린 질문이야."

조용한 다운그레이드 함정

이미지 처리는 텍스트보다 실패 지점이 많아: staging 실패, 해소 실패, 인코딩 실패, 업로드 실패. 이 중 하나가 깨지면, 솔깃한 '우아한' 폴백이 있어: 뭐라도 나가게 질문을 텍스트 전용으로 보내기. 견고해 보여 — 사용자가 에러 대신 답을 받으니까. 근데 이건 트랙 3 의 정직함 실패가 새 옷을 입은 거야. 사용자는 이미지에 대해 물었고; 넌 이미지가 조용히 빠진 질문을 배달했고; Pippa 는 실제로 안 물어진 질문에 답했어. 틀린 질문에 대한 확신에 찬 답이, 맞는 질문에 대한 정직한 실패보다 나빠.

전부-아니면-에러

규칙은 전부-아니면-에러야: 이미지를 포함한 턴은, aggregate 전체가 배달되거나 — 질문 이랑 이미지, 온전히 — 클라이언트가 실패를 드러내고 재시도 위해 입력 전체를 보존해. 텍스트는 가고 이미지는 버려지는 중간 경로는 없어. 이건 트랙 2 의 원자적 aggregate 를 비춰: 질문이랑 이미지가 나눌 수 없는 한 단위로 캡처됐으니, 하나로 배달도 돼야 해. 부분 배달은 부분 캡처만큼 정확히 망가뜨려.

  • 성공: 질문 + 모든 이미지가 Pippa 에 닿음. 턴이 정직하게 답해짐.
  • 에러: 이미지 경로에서 뭔가 실패. 드러내고, 전체 입력을 내구성 있게 지키고, 재시도 제공. 조용히 버려지는 건 없음.
  • 금지: 텍스트 배달, 이미지 조용히 사라짐, 사용자 모름. 이 경로는 존재하면 안 됨.

왜 에러가 다정한 선택인가

이미지 첨부 에러를 드러내는 건 '그냥 텍스트 보내기'보다 덜 매끄러워 보이지만, 사용자를 존중하는 선택이야. 명시적 '이미지 첨부 못 함 — 재시도?' 는 사용자를 통제 안에 두고 질문을 온전히 지켜. 조용한 텍스트 전용 다운그레이드는 결정을 빼앗고 등 뒤에서 의도를 망가뜨려. 정직한 오프라인처럼, 믿음받을 작정인 클라이언트는 보이지 않는 그럴듯한 틀림보다 보이는 회복 가능한 실패를 택해. 금지 경로를 표현 불가능하게 만들어 — 이미지 경로가 실패한 뒤 텍스트를 보내는 코드 분기 없음 — 그러면 보장이 구조적으로 성립해.

Code

전부-아니면-에러: 이미지 버리고 텍스트 보내는 분기 없음·typescript
async function deliverTurn(turn: PippaGoTurn) {
  let images: ResolvedImage[];
  try {
    images = await resolveAll(turn.attachmentIds); // stage/resolve/encode
  } catch (err) {
    // 드러내고 + 보존. 텍스트 전용 전송으로 흘러가지 마.
    await setStatus(turn.deviceTurnId, "failed");
    throw new AttachmentError("이미지 첨부 못 함 — 입력 보존됨, 재시도 가능");
  }
  return callCanonical({ ...turn, images }); // 질문이랑 이미지, 함께
}

// 일부러 `catch { sendTextOnly(turn) }` 가 없어.
// 이미지-실패했으니-텍스트-보내기 경로는 그냥 존재하지 않아.

External links

Exercise

텍스트-딸린-업로드 기능을 조용한 다운그레이드로 감사해: 파일 첨부는 실패했는데 텍스트는 유효하면 어떻게 돼? 그래도 텍스트를 보내? 사용자가 첨부가 버려졌다고 들었는지 추적해. 그다음 전부-아니면-에러로 다시 설계해: 어디서 실패를 드러내고, 전체 입력을 어떻게 보존하고, 조용한 경로를 불가능하게 만들려면 어떤 코드 분기를 지울지.
Hint
조용한 경로는 보통 첨부를 둘러싼 try/catch 가 텍스트 전송으로 흘러가는 거야. 그 흘러가기를 지우고 — 드러내고-보존으로 바꾸는 게 — 해법 전부야. 이미지 실패 뒤 텍스트를 보내는 코드가 없으면, 다운그레이드가 못 일어나.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.