오류와 경고 읽기

코드와 소스 위치에서 고칠 곳을 찾고, 발생 단계에 따라 처리기 사용 여부를 판단합니다.

진단의 코드와 소스 위치를 읽으면 무엇을 고칠지 정할 수 있습니다. 발생 단계를 확인하면 실행 전 오류인지, 실행 중 처리기로 잡을 수 있는 오류인지 구분할 수 있습니다.

아래 명령은 첫 프로그램에서 설치한 네이티브 lispex를 사용합니다.

실행 중 오류의 진단 읽기

다음 전체 코드를 pair.lspx로 저장합니다.

LISPEX
(car 1)
BASH
lispex run pair.lspx

명령은 표준 출력을 비워 두고 표준 오류에 다음 진단을 씁니다. 종료 상태는 1이며 결과 파일은 생기지 않습니다.

E310 pair.lspx:1:1 car: expected a pair, got 1
항목알 수 있는 것
E310연산에 쌍이 필요합니다.
pair.lspx:1:1이 파일의 1행 1열을 살펴봅니다.
car: expected a pair, got 1car가 숫자 1을 받았습니다. 인자를 확인합니다.

첫 항목을 반환하려면 1 대신 '(1 2)처럼 쌍을 넘깁니다. 전체 식 (car '(1 2))의 결과는 1입니다.

오류를 처리하려면 다음 전체 예제를 플레이그라운드에 입력합니다.

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

결과

출력
"car: expected a pair, got 1"

여기서는 guard가 오류 객체를 잡고 메시지를 문자열로 반환합니다. 식은 성공으로 끝납니다.

발생 단계와 할 일 찾기

리더는 소스의 글자를 읽어 값과 형식으로 만듭니다. 정규화는 형식의 구조를 확인하고 축약 문법을 핵심 형식으로 바꿉니다. 두 단계 모두 실행 전에 끝납니다.

단계와 코드살펴볼 곳처리기를 쓸 수 있나요?
리더 · E100, E140, E150토큰, 괄호, 점 있는 리스트, 문자열과 문자의 이스케이프아니요. 소스를 고칩니다.
정규화 · E110, E130예약된 이름과 형식에 필요한 구성 요소아니요. 바인딩이나 형식을 고칩니다.
리더 또는 정규화 · E120허용하지 않는 확장 문법이나 형식아니요. 언어 프로파일에서 지원하는 문법을 씁니다.
실행 중 · E300–E340진단에 나온 연산과 전달한 값실행 중 오류는 처리할 수 있습니다. E314의 예외는 아래에서 확인합니다.
실행 중 경고 · W330, W331폐기 예정 프로시저 이름실행은 계속됩니다. 권장 이름으로 바꿉니다.
자원 한도 · ResourceLimit프로그램의 작업량과 자원 프로파일아니요. 자원 고갈은 잡을 수 있는 E3xx 오류와 별도로 실행을 끝냅니다.

E314는 발생 단계를 확인해야 합니다. 리터럴 1e999는 guard 안에 있어도 읽기 단계에서 실패합니다. (* 1e308 1e308)의 오버플로는 실행 중 발생하므로 잡을 수 있습니다.

실행 중 오류는 정해진 메시지 형식과 일관된 값 표기를 사용합니다. 대부분 해당 호출의 위치를 가리킵니다. E300은 정의되지 않은 이름 자체를 가리킵니다. 따라서 (+ 1 missing)에서는 6열의 missing을 가리킵니다.

처리하지 않은 첫 오류가 실행을 멈춥니다. 리스펙스는 호스트 스택 추적 없이 소스 진단을 보고합니다. 호출 애플리케이션이 비정상 종료했다면 애플리케이션의 실패 원인을 조사합니다.

경고와 결과를 따로 읽기

경고는 연산을 실행하면서 폐기 예정 이름을 알려 줍니다. 다음 전체 코드를 warning.lspx로 저장합니다.

LISPEX
(% 7 3)
BASH
lispex run warning.lspx

표준 출력에는 결과가 나옵니다.

1

표준 오류에는 경고가 나옵니다.

W330 warning.lspx:1:1 `%` is a deprecated alias of `modulo` — prefer `modulo`

종료 상태는 0이며 결과 파일은 생기지 않습니다. %를 modulo로 바꾸면 같은 결과를 얻으면서 이 경고를 없앨 수 있습니다.

폐기 예정 이름새 코드에 쓸 이름실행하는 연산
%modulomodulo
list-firstfirstcar
list-restrestcdr

해당 폐기 예정 프로시저를 실제로 호출하면 연산 전에 경고가 나옵니다. 소스의 호출 위치마다 한 번만 경고합니다. 프로그램에서 같은 이름을 다른 프로시저에 연결했다면 이 경고가 나오지 않습니다.

경고는 발생 순서대로 보존합니다. 표준 출력이나 오류 진단과도 구분합니다. 연산이 실패해도 앞서 발생한 경고는 남습니다. 예를 들어 (list-first 1)에서는 W331 뒤에 E310이 나옵니다.

코드별 뜻 찾기 · guard로 오류 처리하기