진단의 코드와 소스 위치를 읽으면 무엇을 고칠지 정할 수 있습니다. 발생 단계를 확인하면 실행 전 오류인지, 실행 중 처리기로 잡을 수 있는 오류인지 구분할 수 있습니다.
아래 명령은 첫 프로그램에서 설치한 네이티브 lispex를 사용합니다.
실행 중 오류의 진단 읽기
다음 전체 코드를 pair.lspx로 저장합니다.
(car 1)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 1 | car가 숫자 1을 받았습니다. 인자를 확인합니다. |
첫 항목을 반환하려면 1 대신 '(1 2)처럼 쌍을 넘깁니다. 전체 식 (car '(1 2))의 결과는 1입니다.
오류를 처리하려면 다음 전체 예제를 플레이그라운드에 입력합니다.
(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로 저장합니다.
(% 7 3)lispex run warning.lspx표준 출력에는 결과가 나옵니다.
1표준 오류에는 경고가 나옵니다.
W330 warning.lspx:1:1 `%` is a deprecated alias of `modulo` — prefer `modulo`종료 상태는 0이며 결과 파일은 생기지 않습니다. %를 modulo로 바꾸면 같은 결과를 얻으면서 이 경고를 없앨 수 있습니다.
| 폐기 예정 이름 | 새 코드에 쓸 이름 | 실행하는 연산 |
|---|---|---|
% | modulo | modulo |
list-first | first | car |
list-rest | rest | cdr |
해당 폐기 예정 프로시저를 실제로 호출하면 연산 전에 경고가 나옵니다. 소스의 호출 위치마다 한 번만 경고합니다. 프로그램에서 같은 이름을 다른 프로시저에 연결했다면 이 경고가 나오지 않습니다.
경고는 발생 순서대로 보존합니다. 표준 출력이나 오류 진단과도 구분합니다. 연산이 실패해도 앞서 발생한 경고는 남습니다. 예를 들어 (list-first 1)에서는 W331 뒤에 E310이 나옵니다.