2010-05-04 82 views
5

構建.NET庫時,您的異常處理策略是什麼?具體而言,您在處理庫內調用中的異常並將它們暴露給調用代碼時的策略是什麼?庫中的異常處理策略

例如,

  • 你像對待一個庫函數的任何其他,從而讓它不能處理流出來的它,是所有異常?
  • 你會爲該庫創建一個自定義異常嗎?
  • 您是否會捕獲所有異常,並拋出庫異常?你會將原始異常設置爲庫的異常內部異常嗎?
  • 庫對數據庫的依賴性如何影響您的異常處理策略?

對於.NET庫中的異常處理,您會提出哪些指導原則和規則?

回答

1

你治療的庫函數的任何其他,從而讓所有 例外它不能處理流出來 它就好了?

是的,這絕對是默認策略。

您是否會爲該庫創建自定義異常?

是的,如果呼叫者可以想見做些什麼情況這樣做,他們需要能夠將異常與其他異常區分。但這很少見。

庫對數據庫的依賴性如何影響異常處理策略?

數據庫依賴可能需要公開設置,讓調用者指定庫如何處理某些異常(例如,MaximumDeadlockRetries)。

您是否會捕獲所有異常並拋出異常? 您是否將原始異常 設置爲庫的異常內部異常 ?

不,並非所有例外。對於特定的例外情況,這是遠程可能的,儘管我能想到的唯一情況是我的庫已經嘗試處理異常(如上面的數據庫場景)並且失敗。

2
  • 我讓所有異常冒泡,我認爲用戶可能能夠處理。這基本上是我認爲他應該期望看到的東西(IO等)
  • 我將所有想要以更抽象的方式重新拋出的想法包裹起來。在O/R映射器中,我有一個「DataAccessException」,它內部有任何SQL異常 - 因此用戶不必處理它們的內部函數。這裏的想法是,任何應用程序可能想知道發生了SQL級異常,但無論如何都不能試圖修復它(感謝數據庫是多種類型之一等) - 所以包裝很好。
  • 我從來沒有使用通用捕獲調試以外的所有東西。
  • 我總是有一個頂級處理程序(appdomain級別 - 未處理的異常事件)來嘗試向用戶顯示發生意外的異常並將其提交給支持。

自定義異常 - 當它們有意義時。由於框架中的一些通用例外,情況並非如此。

0

一個庫包裝幾個不同的類,可能會拋出不同的例外,恕我直言,恕不另行通過內部的例外滲透出他們的原始類型。相反,它們應該包含在特定於庫的異常中,儘可能清楚地與異常的原始類型相關。

例如,如果一個SQL Server數據庫拋出一個SQL服務器超時異常(不管它的稱呼),應該被包裹在一個MagicDatabaseTimeoutException MagicDatabaseLibrary可以定義MagicDatabaseException,這反過來有幾個派生的異常MagicDatabaseTimeoutException,MagicDatabaseAuthenticationException等。 。同樣,對於可能發生的任何其他半預期異常也是如此。

如果沒有這樣做,調用庫的代碼將沒有實際的選擇,但如果它有任何希望處理潛在的數據庫問題,則使用「Pokemon異常處理」。例如,如果調用代碼應該處理用戶提供憑據登錄到數據庫並且連接失敗的情況,則需要能夠捕獲該異常。如果調用代碼不知道會出現什麼類型的異常,除了捕獲每個異常,希望它是不正確的憑證或其他內容的結果,並且向用戶顯示一條消息,說明連接失敗。幾乎不如提供包裝的例外。