访问 sbcl errno 字符串

Bil*_*osa 2 sbcl common-lisp

在 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
Run Code Online (Sandbox Code Playgroud)

如果我没有发现错误,结果的顶部看起来像这样:

 (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}>
Run Code Online (Sandbox Code Playgroud)

看到那里“没有这样的文件或目录”吗?有没有办法让我的代码可以访问该字符串,以便我的错误处理程序可以说出比“错误 2”更不那么愚蠢的内容?

jki*_*ski 5

条件的报告函数SB-INT:STRERROR使用错误号调用以获取字符串。这反过来只是围绕获取错误代码描述的平台特定方式的简单包装

如果您使用 Emacs/Slime 并且有可用的 SBCL 源代码,您可以使用M-.跳转到函数/类/等的定义。这对于了解内部结构的工作方式非常有用。