2012-07-30 170 views

回答

4

當然,CL有一個非常好的條件系統。一個簡單的選擇是將呼叫打包到ignore-errors中的do-http-request,如果在包裝代碼中發信號通知錯誤條件,則返回nil(以及條件作爲第二值)。之後您可以檢查nil

如果你想要更類似於Java中的異常處理,只需使用handler-case並添加一個適當的錯誤子句(我沒有安裝AllegroServe,但我想你得到一個socket-error提供了一個錯誤的URL - 只是改變那部分如果我誤解):

(handler-case 
    (do-http-request …) 
    (socket-error() 
    …)) 

如果您需要finally樣的功能,使用unwind-protect

(unwind-protect 
    (handler-case 
     (do-http-request …) 
     (socket-error (condition) ; bind the signalled condition 
     …)      ; code to run when a socket-error was signalled 
     (:no-error (value)  ; bind the returned value 
     …))      ; code to run when no condition was signalled 
    …)        ; cleanup code (finally) 

你甚至可以得到更多的看中,並如使用handler-bind通過在堆棧下方調用重新啓動來處理條件堆棧,而無需解開它。例如,如果do-http-request提供重新啓動以再次嘗試使用另一個URL,則可以通過使用新URL重新啓動該重新啓動來處理錯誤情況。我只是爲了完整而提到這一點 - 這對您的用例來說會是過分的,但能夠輕鬆恢復(可能很昂貴)的計算可能是一個相當方便的功能。