2011-01-10 18 views
2

我有下面幾行代碼:如何處理代碼中的API /庫異常?

FileInfo dbFile = new FileInfo(fileName); 
dbFileSize = (long)dbFile.Length/1024;//KB 

有來自new FileInfo(fileName)dbFile.Length通話8個可能的例外。我不能忽視它們。 我得趕他們

你打算怎麼處理那些例外?單獨抓住他們(太多線)?通過捕捉超級Exception只抓住一個除了?或...

+0

所有8個例外的處理行爲是否相同?或者你是否需要類型的「開關盒」? – Ani 2011-01-10 16:30:03

+0

是的,但我可能需要更具體的消息供以後使用。 – 5YrsLaterDBA 2011-01-10 16:46:01

回答

1

正如其他人指出的一般規則是:不要捕捉你無法處理的異常。鑑於您知道該怎麼做,您應該單獨查看8個例外情況,請參閱指南[1]。你永遠不應該抓住Exception的原因是,那麼你也會發現像ThreadAbortException這樣的重要例外,你真的不應該這樣做。

[1]:http://msdn.microsoft.com/en-us/library/ms229005.aspx

9

正確的操作是忽略它們,除非您確實可以修復它們。

他們將傳播到可能能夠解決它們,或記錄他們,或什麼的調用代碼。但是除非你能夠改善你的水平,否則不要抓住他們。

3

如果你知道如何處理它們(即,如果你能糾正這種情況),或者在你的級別處理它們是有意義的。否則,讓高級代碼處理它。

另一件事。如果您打算讓更高級別的代碼處理異常,您也可以捕獲異常,然後用不同的異常對象「換行」,然後拋出異常。新的異常應該是在更高級代碼(即調用使用API​​的代碼的代碼)的上下文中有意義的異常。通常,這是一個很好的方法,可以阻止較低級代碼從「泄漏」到更高級別的細節(實質上是停止抽象泄漏)。

0
  • 對於使用異常(如參數異常或空引用),防止他們發生的,這樣有問題的輸入儘早確定執行斷言和檢查,一路沿着你調用鏈才。例如,您應該要求用戶輸入的路徑在進入任何進一步調用之前進行驗證。如果使用異常被拋出,它們不應該被捕獲(除了最終的記錄器和禮貌execution子手除外)。

  • 對於超出您的控制範圍的異常(例如,在最初檢查它之後文件會消失),請在如果可以,或者需要調用方法進行檢查並處理,則調用點。舉例來說,這一切都取決於如果文件無法再找到時系統要做的事情。

0

另一種方式來思考這個問題,以捕獲所有異常,否則上面的層將會收到異常,但不知道如何處理異常。我將最終用戶包含爲「圖層」,以及其他並不特別注意的系統。因此,作爲人類(!)的最終用戶無法處理其原生格式的異常,因此您可以捕獲代碼中的所有異常,並將其轉換爲人性化的格式,例如屏幕上的錯誤消息。此處理代碼將位於Windows窗體中的按鈕單擊事件處理程序中。同樣,如果調用代碼的系統不是異常的,那麼您需要將異常編組爲一種其他系統可以處理的格式。這也是您記錄異常的地方。另外,如果您可以執行某種恢復,或者您想要添加更多信息(包括原始異常作爲innerException),那麼您只需要捕獲異常,這兩者往往是非常規異常。