2015-08-03 69 views
0

我希望我的網頁在出現函數異常時按預期行事,現在(openid/validate r)只有在用戶從/ login重定向時纔會返回值。但由於這是一個主頁,我希望它也可以在沒有問題的情況下看到。所以我想知道爲什麼「如果」沒有按照我的預期工作?Clojure - 異常處理

java.lang.NullPointerException at/
NullPointerException [no message] 

tfs.routes.home/[fn] 
home.clj, line 48 

--> line 48 
(if (openid/validate r) 

因此,我期望(主頁r)執行而不是NullPointerException。

(openid/validate r)本身失敗並導致異常,因爲它沒有提供所需的參數,是原因嗎?如果是這樣,我該如何解決它?如果沒有,爲什麼我的(主頁r)函數沒有得到執行?

(if (openid/validate r) 
    (show-response (:params r)) 
    (home-page r)) 
+0

這將真正加入到這個問題,如果你能支持像「不工作」有錯誤,異常,代碼... – cfrick

+0

@cfrick添加的錯誤主張。 –

+2

你想了解'try/catch'。但是,您也想知道實際造成NPE的原因。 – schaueho

回答

0

所以我做了這個try/catch,它現在似乎工作正常。由於我使用try/catch,因此不確定是否仍然應該使用if

(GET "/" [:as r] (home-page r) 
(try (if (openid/validate r) 
    (show-response (:params r)) 
    (home-page r)) 
(catch Exception e (home-page r)))) 
+0

拋出'if',這是不必要的。仍然 - 弄清楚'openid/validate'是否會拋出NPE或者調用'show-response'。如果它是前者,你應該改變(或者包裝)代碼,以便它返回一個布爾值('false') - 相當明顯,驗證失敗並不構成_exceptional case_,而是一個期望的(cf 。http://www.hanselman.com/blog/GoodExceptionManagementRulesOfThumb.aspx) – schaueho