Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp 如何在Common Lisp中捕获错误消息?_Common Lisp_Sbcl - Fatal编程技术网

Common lisp 如何在Common Lisp中捕获错误消息?

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中那样返回错误对象,但我想知道是否有任何方法可以捕获错误消息,因此我不需要在错误发生时

我无法捕获在REPL中打印的错误消息,我想将其作为字符串或任何其他类型打印出来,这在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