오류, 경고, 진단

리더와 정규화, 런타임, 경고, 자원 결과는 서로 다른 단계에 속하며 각자 결정적인 채널을 가집니다.

언제 필요한가요?

코드를 고치기 전에 진단이 어느 단계에서 났는지부터 읽으세요. 리더 오류는 철자를 고치라는 뜻입니다. 정규화 오류는 폼의 모양을 고치라는 뜻입니다. 런타임 오류는 폼 자체는 유효했지만 실행 도중에 실패했다는 뜻입니다.

실행으로 확인하기

LISPEX
(guard (e (else (error-object-message e))) (car 1))

관측 결과

OUTPUT
"car: expected a pair, got 1"

예제 읽기

car가 쌍 대신 1을 받아 잡을 수 있는 런타임 오류를 냅니다. guard가 그 오류 객체를 잡아 안정된 메시지를 돌려줍니다. 그래서 프로그램은 호스트 스택 추적을 찍지 않고 문자열 하나를 남기며 정상적으로 끝납니다.

이 순서로 생각하세요

  • 런타임 오류는 E3xx 코드와 안정된 템플릿, 결정적인 irritant 표기, 그리고 감싸고 있는 호출 위치를 함께 씁니다.
  • 경고는 순서가 있는 관측입니다. 진짜 % 호출은 modulo를 실행하기 전에 W330을 냅니다. 진짜 list-first·list-rest 호출은 car·cdr를 실행하기 전에 W331을 냅니다. 경고는 소스의 호출 위치마다 한 번만 나고, 같은 이름을 가린 바인딩은 경고하지 않으며, 뒤따르는 연산이 실패해도 경고 기록은 남습니다.
  • 처음 만난 미처리 오류는 호스트 스택 추적 없이 실행을 중단합니다. 자원 고갈은 잡을 수 있는 E3xx 바깥에 있습니다.

빠르게 고르기

분류나타나는 때먼저 할 일
E1xx 리더소스가 datum이 될 수 없음강조된 토큰이나 구분자 수정
E2xx 정규화폼의 정적 형태가 잘못됨폼 철자·위치·인자 수 확인
E3xx 런타임평가가 잘못된 연산에 도달이름 붙은 프로시저와 문제 값을 확인
W3xx 경고폐기 예정 표면을 쓰지만 실행은 계속됨알려 준 대체 항목으로 이동
자원 결과프로필 한도에 도달작업을 줄이거나 맞는 선언 프로필 선택

흔한 오해

경고는 stdout이 아닙니다. 순서를 바꾸거나 진단에 합쳐서도 안 됩니다.

새 코드에는 modulofirst, rest를 쓰세요. 폐기 예정 표기는 호환을 위해서만 계속 실행됩니다.

현재 경계

  • 플랫폼 panic과 빈 크래시, 비결정적 호스트 텍스트는 유효한 게스트 진단이 아닙니다.

다음으로

코드를 정확히 찾아보려면 진단 카탈로그를 여세요. 결정을 내놓기 전에 검증하는 흐름은 오류 가이드에서 보여 줍니다.

진단 카탈로그 · 오류 가이드