2014-04-06 63 views
3

有沒有辦法收集警告,但仍然執行它們所屬的代碼?在Common Lisp中捕獲但繼續警告

我的第一個想法是使用handler-case來抓住所有的條件,只是從警告繼續,但在SBCL SimpleWarning似乎沒有continue重新啓動。

CL-USER> (handler-case (warn "Nope") (t (c) c)) 
#<SIMPLE-WARNING "Nope" {1008080D53}> 
CL-USER> (compute-restarts (handler-case (warn "Nope") (t (c) c))) 
(#<RESTART SWANK::RETRY {10080867F3}> #<RESTART ABORT {1004710323}> 
#<RESTART ABORT {1004710073}>) 
CL-USER> 
+0

爲什麼要繼續重啓?還有條件不能'重新啓動'。 –

回答

5

您需要查找WARN實際上做了什麼。默認情況下它會打印一條警告。如果你想訪問條件對象,你需要編寫一個處理程序。然後從處理程序中返回已經在繼續。如果您想擺脫打印的警告,請在處理程序中撥打MUFFLE-WARNINGMUFFLE-WARNing使用相同名稱的重新啓動。

CL-USER 32 > (let ((conditions)) 
       (handler-bind ((t (lambda (c) (push c conditions)))) 
       (warn "foo") 
       (warn "bar") 
       (format t "~%baz")) 
       conditions) 
Warning: foo 
Warning: bar 
baz 
(#<SIMPLE-WARNING 402011C9B3> #<SIMPLE-WARNING 402011C63B>) 
5

Handler-case當一個條件符合其中一個條款時展開。你應該使用handler-bind