请先查看#7755661。我正在使用 ECL,基本上是想执行一些代码,捕获任何可能发生的条件,然后继续执行,而不提示或进入调试器。使用以下处理程序案例宏很容易实现这一点:
(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
可能是我需要调用的,但我该如何调用它?如果我尝试:
(handler-case foo (error (condition) (SI::REPORT-FUNCTION condition)))
它告诉我 SI:REPORT-FUNCTION 未定义。ECL 中的 SI 或 SYS 是实现内部函数和变量的包,但我不担心我的代码是否不可移植,只要它可以工作。
顺便说一句,在其他类型的条件对象中,还有其他显然有用的插槽,命名为SI:FORMAT-CONTROL
and SI:FORMAT-ARGUMENT
,但我也无法从我的代码中访问它们中的任何一个。
我一直在寻找与getMessage()
Lisp 中 Java 异常对象的方法类似的东西,但我的资料中没有一个提到过类似的东西。
此外,是否有希望能够在 code.lisp 中获得错误发生的行号?否则,用户将很难在他的 code.lisp 源文件中找到问题所在。我真的很想提供这些信息,并且在第一个错误处停止对我来说是可以接受的。