我想添加DataAccessLayerException和DuplicateEntryException类。 但我对我应该从哪些课程中产生怀疑呢? 例如,DataAccessLayerException(将用作从数据访问层抛出的异常的包装)可以从Exception或DbException派生。但是我担心DbException应该只是OracleException或SqliteException之类的提供者异常的基类。我不知道。 和DuplicateEntryException(是的,我讨厌db提供程序没有实现这个异常,所以我自己创建它)可以从Exception或DbException派生,甚至可以从DataAccessLayerException派生。
你怎么看?还请说明你为什么这么认为。请,经验丰富的开发人员/建筑师。
提前谢谢。
答案 0 :(得分:1)
我想我会在Exception类上建立自定义异常。我假设您计划包装任何异常,这将是您正在使用的代码抛出的DbException。如果是这样,那么使用Exception会使调用代码不应该捕获基类异常而不是自定义异常。这是因为捕获通用异常通常是不好的做法。基于DbException将允许您的代码的用户捕获DbException并错误地捕获未解包的异常,因为您的异常和未解包的异常都基于同一个类。
如果您没有包装所有异常,那么我可能会重新考虑并使您的异常特化为DbException。在这种情况下,您希望用户实际上能够捕获DbExceptions,包括您的DbExceptions,或者能够以不同方式处理您的异常。对不起华夫饼干,但我认为这确实取决于你的目标。对于它的价值,我通常采用前一种方式,并在最低基类上定制自定义异常。
P.S。我不知道我是否有资格成为有经验的开发人员/架构师,但我确实有意见。
答案 1 :(得分:1)
如果它是一个大项目,我倾向于有一个基本异常类,它派生自System.Exception
所有特定于域的异常。因此,如果产品名称为“Foo”,则所有异常都来自“FooException”。
我并不认为这是一种最佳做法,如果有人坚持认为这是一种不好的做法,我不会感到惊讶,但它在我的书中有一些优点:
Exception
或DbException
。如果您有多个大型子项目(例如Foo.Core
表示域模型,Foo.Data
表示数据层,Foo.Services
表示业务逻辑,Foo.UI
表示视图模型),然后我也可以为每个创建一个根异常,派生自FooException
。在这种特殊情况下,它将是FooDataException
,并且DAL中发生的每个异常(例如DuplicateEntryException
)都源于此。您还可以使用FooServiceException
和FooUIException
以及其他任何内容。
但这只是意见。我不认为有任何正确或错误的答案。
编辑:ApplicationException
除外,这是错误的答案!