Common lisp 如何在Common Lisp中捕获错误消息?
我无法捕获在REPL中打印的错误消息,我想将其作为字符串或任何其他类型打印出来,这在Common Lisp中可能吗?这在其他语言中很常见,例如Javascript:Common lisp 如何在Common Lisp中捕获错误消息?,common-lisp,sbcl,Common Lisp,Sbcl,我无法捕获在REPL中打印的错误消息,我想将其作为字符串或任何其他类型打印出来,这在Common Lisp中可能吗?这在其他语言中很常见,例如Javascript: var myError = undefined; try { some(); }catch(e){ myError = e.message; } 当然,在Common Lisp中,这不会像这样工作,毕竟它不会像JavaScript中那样返回错误对象,但我想知道是否有任何方法可以捕获错误消息,因此我不需要在错误发生时
var myError = undefined;
try {
some();
}catch(e){
myError = e.message;
}
当然,在Common Lisp中,这不会像这样工作,毕竟它不会像JavaScript中那样返回错误对象,但我想知道是否有任何方法可以捕获错误消息,因此我不需要在错误发生时打印它,而是在我需要时打印
我正在使用:
SBCL
我正在努力:
CL-USER> (handler-case (/ 3 0)
(division-by-zero (c)
(defvar *my-error* c)))
; in: HANDLER-CASE (/ 3 0)
; (/ 3 0)
;
; caught STYLE-WARNING:
; Lisp error during constant folding:
; arithmetic error DIVISION-BY-ZERO signalled
; Operation was (/ 3 0).
;
; compilation unit finished
; caught 1 STYLE-WARNING condition
*MY-ERROR*
CL-USER> *my-error*
#<DIVISION-BY-ZERO {1004486093}>
请小心,您使用的是defvar
,因此,如果执行同一代码两次,将不会分配变量。最好定义一个返回字符串的函数,并使用局部变量
我想捕获的是以下消息
该消息特定于您的环境打印错误消息的方式,捕获更为困难,也许您可以绑定自己的字符串流并捕获整个输出(?),但我不建议这样做。您确实捕获了该条件,因此可以复制错误消息,但你似乎想抓住SBCL编译警告。因此,它与条件无关 我没有解决方案,但你应该在IMO的另一个方向上搜索(如何捕捉SBCL警告等) 如上所述,您不应该使用
defvar
。您可以改用setf
,即使您以前没有defvar
变量。在这种情况下,您将得到另一个警告:
; in: HANDLER-CASE (/ 3 0)
; (SETF *MY-ERROR* C)
; ==>
; (SETQ *MY-ERROR* C)
;
; caught WARNING:
; undefined variable: *MY-ERROR*
;
; compilation unit finished
; Undefined variable:
; *MY-ERROR*
; caught 1 WARNING condition
; caught 1 STYLE-WARNING condition
顺便说一句,你好像在用烹饪书,是吗?:) 我在这里使用“defvar”只是为了快速试验。但即使如此,handler case仍然会发出错误,我不想打印它,我打印了这条消息,您告诉我如何打印,当我希望时。@PerduGames没问题,这句话也是写给其他阅读答案的人的:-)@PerduGames:defvar是错误的快速实验工具。不要在代码中使用defvar。。。
CL-USER> (write *my-error* :escape nil)
arithmetic error DIVISION-BY-ZERO signalled
Operation was (/ 3 0).
#<DIVISION-BY-ZERO {100369B843}>
CL-USER> (with-standard-io-syntax (format nil "~a" *my-error*))
"arithmetic error DIVISION-BY-ZERO signalled
Operation was (/ 3 0)."
; in: HANDLER-CASE (/ 3 0)
; (SETF *MY-ERROR* C)
; ==>
; (SETQ *MY-ERROR* C)
;
; caught WARNING:
; undefined variable: *MY-ERROR*
;
; compilation unit finished
; Undefined variable:
; *MY-ERROR*
; caught 1 WARNING condition
; caught 1 STYLE-WARNING condition