2017-09-14 90 views
1

在SBCL爲我打開一個不存在的文件時,請在這裏我可以處理錯誤:訪問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」少一點?

+4

'(sb-int:strerror errno)'似乎是如何條件[報告功能](https://sourceforge.net/p/sbcl/sbcl/ci/master/tree/contrib/sb-posix/ interface.lisp#l66)得到它。 – jkiiski

+0

@jkiiski:完美!如果您希望將其作爲正式答案,我會加倍努力並將其標記爲首選解決方案。 –

回答

4

該條件的report function調用SB-INT:STRERROR與獲取字符串的錯誤號。這反過來只是一個simple wrapper圍繞平臺獲取錯誤代碼描述的具體方式。

如果您使用Emacs/Slime並且有SBCL源代碼可用,您可以使用M-.跳轉到函數/類/ etc的定義。這對了解內部工作是非常有用的。