2015-10-24 82 views
1

(check < 4 3)返回屏幕上的錯誤信息,但該函數也返回#<void>。我期待它只返回一個異常而不是無效的。我是否錯誤地瞭解了以下racket docracketunit檢查沒有拋出異常

「如果條件成立,則檢查評估爲(void)。如果條件不成立,則檢查會引發exn:test的實例:檢查具有詳細信息的信息。

> (display (check < 4 3)) 
-------------------- 
FAILURE 
name:  check 
location: (|interactions from an unsaved editor| 75 11 1868 13) 
expression: (check < 4 3) 
params:  (#<procedure:<> 4 3) 

. . Check failure 
-------------------- 
#<void> 
> 

回答

6

我覺得你的解釋是有道理的,而且文檔都寫在一個誤導的方式,但也許不是技術上不正確。

看看執行情況,我認爲檢查總是會返回#<void>(請參閱this line)。

但是,如果檢查失敗,實際上會引發異常。只是在默認情況下,它總是被捕獲並轉換爲錯誤打印輸出。這意味着該例外通常不會在check之外被捕獲,因此它總是返回#<void>

您可以通過參數化current-check-around參數來調整此行爲。這裏有一個例子:

-> (require rackunit) 
-> (define (my-check-around thunk) 
    (with-handlers ([exn:test:check? (λ (e) (raise e))]) 
     (thunk))) 
-> (parameterize ([current-check-around my-check-around]) 
    (check < 4 3)) 
; Check failure [,bt for context] 

raise呼叫處理程序傳播異常更進一步,它是由REPL抓獲。如果您只是想自定義如何處理異常,您也可以參數化current-check-handler


我推修復到rackunit文檔,所以在未來的球拍版本的文檔應該是這個問題更清楚。

+0

謝謝阿蘇姆。非常感謝您的幫助。 –