2009-12-24 52 views
3

我想添加DataAccessLayerException和DuplicateEntryException類。 但是我很懷疑我應該派生哪些類? 例如,DataAccessLayerException(將用作數據訪問層拋出的異常的包裝)可能來自Exception或DbException。但是恐怕DbException應該只是提供者例外的基類,例如OracleException或SqliteException等等。我不知道。 和DuplicateEntryException(是的,我討厭這個異常不是由數據庫提供者實現的,所以我將自己創建它)可以從Exception或DbException派生,或者從DataAccessLayerException派生。從哪些類應該派生我的自定義DataAccessLayerException和DuplicateEntryException?

您認爲如何?也請給出你爲什麼這麼認爲的論點。

請只有經驗豐富的開發人員/建築師。

預先感謝您。

回答

1

我想我會基於Exception類的自定義異常。我假設你打算包裝任何異常,這是你正在使用的代碼拋出的DbException。如果是這樣,那麼使用Exception會使調用代碼不應該捕獲基類異常而不是您的自定義異常。這是因爲捕獲泛型異常通常是不好的做法。基於DbException將允許您的代碼的用戶捕獲一個DbException並錯誤地捕獲未包裝的異常,因爲您的異常和未包裝的異常都基於相同的類。

如果你沒有包裝所有的異常,那麼我可能會重新考慮並使你的異常特化DbException。在這種情況下,您希望用戶實際上能夠捕獲DbExceptions(包括您的),或者能夠以不同的方式處理您的異常。對不起華夫餅,但我認爲這確實取決於你的目標。對於它的價值,我通常會採用前一種方法,並在最低基礎類別上定製自定義例外。

P.S.我不知道我是否有資格成爲有經驗的開發人員/架構師,但我確實有意見。

1

如果這是一個大型項目,我傾向於有一個基礎異常類,它從System.Exception派生出來用於所有領域特定的異常。因此,如果產品名稱是「Foo」,則所有異常都來自「FooException」。

我不是這個叫最佳做法是,如果一些人堅持認爲這是一個不好的做法,我也不會感到驚訝,但它在我的書中的一些優點:

  • 如果您曾經想要合併項目或編寫混合應用程序,讓層次結構的根目錄明確告訴你哪個子系統有違反規則或假設。調查某個大型業務流程中的錯誤報告更容易。
  • 這是一個完全毫不含糊的標準,開發人員不必擔心是否繼承ExceptionDbException
  • 如果您需要添加項目全局信息(例如,Web應用程序/服務可能希望包含有關當前安全上下文的信息或發生異常的服務器節點),則可以更輕鬆地將項目全局信息添加到異常樹上)。並不是說你總是需要或想要這樣做,但有些情況下你可能會這樣做。

如果你有幾個大的子課題(比如Foo.Core域模型,Foo.Data爲數據層,Foo.Services業務邏輯,並Foo.UI的視圖模型),那麼我也可以創建一個根異常爲每一個,從FooException派生。在這種特殊情況下,它將是FooDataException,並且DAL中發生的每個異常(例如DuplicateEntryException)都源於此。你也可以有你的FooServiceExceptionFooUIException以及其他任何東西。

雖然這只是意見。我不認爲有任何正確或錯誤的答案。

編輯:除ApplicationException,這是錯誤的答案!

相關問題