2010-11-29 31 views
0

假設我有一個像我應該在方法中捕獲這個NumberFormatException嗎?

void A(long input) { 

    ...... 

} 

方法基本上,它運作良好,當輸入是長還是能夠成功轉換其他類型的長。

但是,當一些錯誤的數據輸入時,會拋出NumberFormatException。所以一個健壯的方法應該是

void A(long input){ 

    try{ 
     ... 
    }catch(NumberFormatException e){ 

    } 

} 

然而,一些開發人員認爲該項目是一個BS應用程序。所以輸入是從Web UI傳遞的。所以它可以確認輸入是有效的。並且不需要處理這個異常。

但我認爲這是必須的。你怎麼看?謝謝。

+2

你的問題沒有任何意義的措辭。 `輸入'是一個很長的時間。這個NumberFormatException應該來自哪裏? – 2010-11-29 07:27:56

+0

如果從另一個方法輸入。輸入是字符串「36000L」; – Joseph 2010-11-29 08:22:43

回答

0

是否在函數內部捕捉異常確實是一種選擇。功能規格有幫助。

然而在你的情況下,由於該函數沒有返回任何東西,調用者怎麼知道發生了什麼錯誤?如果沒關係,那麼捕捉可能會很好。如果它確實重要,那麼傳播異常是通知錯誤存在的好方法(除非函數簽名被改變)。

0

我認爲最好有一個永遠不會使用的try-catch塊,並且需要它。輸入傳遞給Web-UI的事實意味着將來可以修改任何驗證邏輯。

但是,您需要做的是確保向用戶通知錯誤。

2

如果方法接受long,那麼方法本身就沒有轉換 - 在調用該方法之前,參數將被轉換爲被推入堆棧,並且您將無法捕獲轉換方法本身內的錯誤。

如果你想通過一個有參數的String,那麼你會做自己的轉換 - 並且要麼需要捕獲異常,要麼拋出異常。無論哪種方式都可以同樣有效,並且選擇取決於您希望如何處理無效值。如果你只是拋出一個異常,說「這不是一個真正的數字」或什麼的,那麼你可能只是拋出異常。

0

有時,我們有99.5%的人確定在一段代碼中不會出現異常情況。

private void String(String validatedStringWithALongValue) { 
    try { 
    long l = Long.parseLong(validatedStringWithALongValue); 
    // ... do what has to be done 
    } catch (NumberFormatException oops) { 
    Exception e = new RuntimeException(oops); 
    log.error("Bad news - validation failed or has been bypassed", e); 
    throw e; 
    } 
} 
0

的這個問題的答案取決於你的系統設計:但如果剩餘的0.5%,可能會損害應用程序或數據庫的一致性,它可能之前不好的事情發生更好的捕捉異常並拋出一個運行時異常。

  • 如果是在Web UI進行數據類型的驗證的責任,那麼它是合理的下一級假設驗證已經完成,並允許NumberFormatException傳播。但是,儘管如此,服務器端代碼應該捕獲(意外)異常,記錄它並生成適當的HTTP響應代碼。

  • 如果不是Web UI的責任來執行數據類型驗證,那麼下一個級別需要生成一個合適的(用戶友好的)錯誤消息,並且使用戶可以很容易地糾正它。 (例如,在HTML實現的web UI僅將無法驗證數據在任何程度。)

如果您的系統設計不明確指定了各種驗證的責任屬於,則設計有缺陷。

你也應該考慮是否是通過數字作爲字符串,他們已經過驗證後是一個好主意。這可能是必要的;例如如果這些圖層位於獨立的webapp容器中。但是,如果驗證和業務邏輯都在同一個servlet,那麼前者應傳遞一個intlong,而不是一個數字後面的String表示。

最後,如果任何理論上內部Web API都是實際上暴露,你至少應該做足夠的驗證,以保護它們免受黑客攻擊。例如,如果面向用戶的Web UI是HTML + Javascript,那麼還必須有一個與之通信的公開的基於HTTP的API。黑客繞過你的GUI和談話目錄到HTTP API是一件簡單的事情。所以HTTP API應該至少在必要的程度上驗證請求以掩蓋企圖利用的漏洞。

相關問題