2017-09-14 8 views
1

: 나는 오류를 잡을 수없는 경우접근 SBCL의 errno를 문자열 존재하지 않는 파일을 열 때 내가 여기에서 나는 오류를 처리 할 수 ​​SBCL에서

(require "SB-POSIX") 
(let* (fd) 
    (handler-case 
     (setf fd (sb-posix:open "w" sb-posix:o-rdonly)) 
    (sb-posix:syscall-error (c) 
     (princ "error ") 
     (princ (sb-posix:syscall-errno c)) 
     (princ " during ") 
     (princ (sb-posix:syscall-name c)) 
     (terpri)))) 
error 2 during OPEN-WITHOUT-MODE 

는, 결과의 상단 부분은 다음과 같습니다를 :

(require "SB-POSIX") 
(let* (fd) 
    (setf fd (sb-posix:open "w" sb-posix:o-rdonly))) 
Unhandled SB-POSIX:SYSCALL-ERROR: 
    Error in SB-POSIX::OPEN-WITHOUT-MODE: No such file or directory (2) 

Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {1001976AB3}> 

"해당 파일이나 디렉토리가 없습니다"라는 내용을 참조하십시오. 거기에 내 코드가 그 문자열에 액세스 할 수있는 방법이 있나요, 그래서 내 오류 처리기는 "오류 2"보다 좀 덜 dorky 말할 수 있습니까?

+4

'(sb-int : strerror errno)'는 조건 [보고 기능] (https://sourceforge.net/p/sbcl/sbcl/ci/master/tree/contrib/sb-posix/)이되는 방법처럼 보입니다. interface.lisp # l66) 그것을 얻는다. – jkiiski

+0

@jkiiski : 완벽한! 그것을 공식적인 답변으로 만들고 싶다면, 나는 그것을 upvote하고 선호하는 솔루션으로 표시합니다. –

답변

4

조건에 대한 report function은 오류 번호가있는 SB-INT:STRERROR을 호출하여 문자열을 가져옵니다. 이는 오류 코드 설명을 얻는 플랫폼 특정 방법을 중심으로 단지 simple wrapper입니다.

Emacs/Slime을 사용하고 SBCL 소스 코드를 사용할 수있는 경우 M-.을 사용하여 functions/classes/등의 정의로 건너 뛸 수 있습니다. 이는 내부 구조의 작동 방식을 찾는 데 매우 유용합니다.