2008-11-19 54 views
3

如果一個方法檢查它的輸入並檢測到非法輸入,它應該怎麼做:引發一個異常(或使用另一個錯誤機制)或什麼也不做/忽略錯誤的輸入?方法應該忽略非法輸入或引發異常嗎?

在Java中,如果給定null參考作爲參數,HashTable-class將拋出NullPointerException。這有時令人討厭,但我認爲它可能有優勢,因爲錯誤很早就被捕獲了。其他一些方法忽略了非法輸入,無所作爲。這不那麼煩人,通常沒有什麼不好發生,但可能會出現這種情況,那麼這種行爲會導致頭痛 - 或者不是?

我不確定,哪種方式更好。所以我問你:你對這個問題有什麼看法?

回答

8

肯定會拋出異常。例外令人討厭的目的是迫使你去做關於它們的事情。

想想看,如果你的程序對壞的輸入什麼也不做,你應該怎麼讓用戶知道什麼都沒有發生,爲什麼?另外,需要多長時間調試一個在錯誤條件下什麼也不做的程序?

+0

+1,這就是我寫了。 – 2008-11-20 01:31:51

2

這非常依賴於您正在開發的應用程序。

儘管有非法輸入,但即使輸入了錯誤,對於計算藥物劑量的應用程序而言,輸出的結果仍然是錯誤的。另一方面,如果不會造成災難性的後果,那麼什麼也不做就可以。

另一種選擇是改變非法輸入到最近的合法值(例如,如果爲一個整數的範圍是0 - 100,並且收到-10,它可能是向精其設置爲0,並繼續進行處理)。

您應該嘗試考慮如何處理您正在編寫的特定方法中的錯誤以及錯誤處理如何影響整體應用程序的可能後果。

2

假設這是一個公共方法,該方法和那些調用此方法的方法之間的契約是什麼?

如果您正在編寫此方法,那麼合同是設計的一部分。你可以選擇

  • 標誌錯誤以某種方式(自定義異常是一種選擇,但不是唯一的一個)
  • 糾正錯誤在某些情況下,繼續
  • 溝錯誤輸入並繼續彷彿什麼都沒有發生過。

最後,它確實取決於方法在做什麼以及對方法有什麼期望。

您可以將Class替換爲方法並具有相同的選項。

在某些情況下,您可能無法引發異常 - 即固件嵌入式微控制器。在這些情況下,您必須設計一個流程來處理錯誤的輸入並繼續處理有效的輸入。

乾杯,

-R

4

我認爲它依賴於抽象你正在使用的上下文或層。最重要的是要保持一致。如果您在該級別拋出異常,繼續前進,把你的異常了。如果沒有,檢查該層是如何表現,做同樣的。

1

快速失敗:永遠不要忽略錯誤的輸入。您可以隱藏的問題,使他們很難找到。

Design by Contract(DBC)有些推得很遠。

按照那些已經在您的項目或公司內使用的做法 - 或現在定義它們。