결정적으로 오류 처리하기

절차적으로 처리할 때는 `with-exception-handler`를 쓰고, 잡을 수 있는 오류 객체를 조건별로 가려낼 때는 `guard`를 씁니다.

실행으로 확인하기

LISPEX
(guard (e ((error-object? e) (error-object-message e))) (error "bad input"))

관측 결과

OUTPUT
"bad input"

패턴 따라가기

  1. 게스트 오류를 냅니다. (error "bad input")은 잡을 수 있는 오류 객체를 만듭니다. 메시지는 언제나 같습니다.
  2. 구조화된 값을 검사합니다. guard는 출력된 문자열을 뜯어보지 않고 error-object?로 값을 확인합니다.
  3. 복구 값을 반환합니다. 선택된 절이 메시지를 꺼냅니다. 그래서 폼 전체의 값은 "bad input"이 됩니다.

이 순서로 생각하세요

  • raise-continuable은 핸들러가 낸 값을 raise 지점으로 돌려줍니다. 재개할 수 없는 raise는 정상적으로 돌아오지 못합니다.
  • 오류 객체는 문서에 적힌 술어와 접근자로 확인하세요. 표시된 진단 문자열을 파싱하면 안 됩니다.
  • 맞는 guard 절이 하나도 없으면 원래 오류가 그대로 다시 발생합니다.

직접 확인하기

guard 절 가운데 오류 객체와 맞는 것이 하나도 없으면 어떻게 될까요?

원래 오류가 그대로 다시 발생합니다. 맞는 절이 없다고 해서 평범한 성공 값으로 바뀌지는 않습니다.

흔한 오해

ResourceLimit은 잡을 수 없습니다. 호스트가 죽는 상황도 친절한 게스트 오류로 바뀌지 않습니다.

다음으로

진단 문서는 단계와 코드를 설명합니다. 결정 규칙 가이드는 잘못된 입력을 비즈니스 결정 전에 걸러 내는 법을 보여 줍니다.

진단 · 결정 규칙