2009-12-24 28 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,这是错误的答案!

相关问题