먼저 #7755661을 참조하십시오. ECL을 사용하고 있으며 기본적으로 일부 코드를 실행하고 발생할 수있는 모든 종류의 조건을 트랩 한 다음 디버거에 메시지를 표시하거나 입력하지 않고 계속 실행하려고합니다. 여기에는 다음 핸들러의 경우 매크로 달성하기 쉽습니다 :Embedded ECL Lisp 오류 처리 기본 오류 문자열 및 가능한 줄 번호를 가져옵니다.
(handler-case
(load "code.lisp") ; this may raise a condition
(error (condition)
(print condition))) ; this prints sth like #<a UNBOUND-VARIABLE>
내 유일한 문제는 내가 사용자에게보다 의미있는 오류를 인쇄하는 일반적인 방법을 찾을 수 있다는 것입니다. 사실 내 응용 프로그램은 HTTP 서버이며 출력은 웹 페이지로 이동합니다. code.lisp은 사용자가 작성하고 모든 종류의 조건을 발생시킬 수 있습니다. 이제는 모든 코드를 내 코드에 나열하려고합니다. 핸들러 - 케이스를 사용하지 않을 때 REPL에서 볼 수있는 것과 동일한 오류 메시지를 인쇄하고 싶지만 HTML 페이지에서는 예를 들어 "언 바운드 변수"오류의 경우 "변수 VAR이 언 바운드"와 같은 문자열입니다.
유형 객체 UNBOUND-VARIABLE
을 검사하면 두 개의 슬롯이 있습니다.이 경우에는 컴파일 된 함수 인 SI:REPORT-FUNCTION
이고이 경우에는 SI:NAME
이 변수의 이름으로 설정됩니다. 나는 SI:REPORT-FUNCTION
내가 호출 할 필요가있을 수 있지만 어떻게 부를 수 있을까요? 시도한 경우 :
SI : REPORT-FUNCTION은 정의되지 않았습니다. ECL의 SI 또는 SYS는 구현 내부의 함수 및 변수를위한 패키지이지만 작동하는 한 내 코드가 이식 가능하지 않더라도 걱정하지 않습니다.
다른 종류의 조건 개체에는 또한 내 용도로 다른 용도로도 유용한 슬롯이 있습니다. 이름은 SI:FORMAT-CONTROL
및 SI:FORMAT-ARGUMENT
이지만 내 코드에서도 액세스 할 수 없습니다.
나는 Lisp의 getMessage()
Java 예외 객체의 메소드와 비슷하게 비슷하게 찾고 있었지만, 내 소스 중 어느 것도 그런 식으로 언급하지 않았다.
또한 오류가 발생한 code.lisp에서 줄 번호를 가져올 수있는 희망이 있습니까? 그것 없이는 사용자가 code.lisp 소스 파일에서 문제를 찾을 수 없을 것입니다. 나는이 정보를 제공하고 싶을 것이고 첫 번째 오류에서 멈추는 것은 나를 받아 들일 만하다.
감사합니다. Lisp 해커! 그것은 의미가 있습니다, 나는 인쇄물의 출력이 읽기 쉽다는 것을 잊었습니다! 어쨌든, 표준에는 몇 가지 단점이 있으며 우리는 그것을 바꿀 수 없습니다 : (예를 들어, 줄 수를 인쇄하는 것에 대해서는 단서가 없습니다.) –
@Antonio Bonifati : Lisp 구현이 에러 위치를 어떻게 다루는 지에 대해서는 크게 차이가 있습니다. 예를 들어 LispWorks는 '소스 로케이터'에 대한 아이디어를 가지고 있습니다 (소스는 청취자, 편집자 버퍼, 파일 등에서도 얻을 수 있습니다). ECL이 뭔가를 제공하는지 모르겠다. –