6

如何优雅地实现错误处理?例如,我的数据访问层可能会引发 2 种类型的错误:1) 未经授权的访问,在这种情况下,页面应该隐藏所有内容并仅显示错误消息 2) 通知用户此类内容已存在于数据库(例如,名称不是唯一的),在这种情况下,我不想隐藏所有内容。

编辑:

由于这里的一些评论,我设计我应该创建派生的专门异常类型,例如 NotAuthorizedException、DuplicateException 等......这一切都很好,但我可能会看到 2 个问题:

1)每个存储过程都有一个返回字段 p_error ,其中包含错误消息。从 DB 获取数据后,我需要检查该字段以查看返回的错误类型,以便引发适当的异常。所以,我仍然需要将我的错误类型/错误消息存储在某个地方......换句话说,我应该如何向用户提供确切的消息(在某​​些时候我需要)而不先检查 p_error 字段。这让我回到了错误对象。任何人?

2)我可能会变成一场噩梦,其中异常的数量等于错误消息类型的数量。

我在这里错过了什么吗?

非常感谢大家!

4

6 回答 6

4

您应该查看Enterprise Library中的异常处理块。许多关于包装异常和在层之间传递它们的好技巧和代码软件。

于 2009-04-06T23:59:50.417 回答
3

您的业​​务层在哪里,为什么不检查授权和完整性?DAL 的级别太低,无法检查这些规则——如果你在那里遇到问题,几乎是时候抛出异常了。您的业​​务层或控制器可以捕获该异常,并显示合理的消息 - 但这不是您应该经常做的事情。

于 2009-04-07T00:06:10.730 回答
0

我正在考虑使用的一个选项是创建一个错误类,但是我需要将它从 UI 传递到业务层,然后通过引用传递到数据访问层

我不确定我是否理解这一点。您不必在每一层都传递错误对象。例如,在您的一个示例中,errors that inform the user that something like this already exists in the database (say name not unique - for example)框架可能会引发 sql 异常,您只需要在业务层或 UI 层捕获特定异常即可。

其他人建议的企业库的异常处理块将允许您在 web.config 文件中定义一些基于策略的异常处理。如果您想开发一些企业应用程序,这可能是个好地方。但是对于简单的应用程序,您可能不需要走那么远。

于 2009-04-07T00:36:26.803 回答
0

上层发生的事情不取决于您的数据访问层。它甚至不应该知道上层将要做什么。如果你有重复键错误,那么它应该抛出类似“DuplicateKeyException”的东西。如果您遇到授权错误(我认为您的意思是“异常”),那么不要对它做任何事情 - 让它冒泡回到 UI 层,它可以显示适当的错误页面。

请记住,错误状态值等是我们发明异常的原因。

于 2009-04-07T02:21:09.173 回答
0

正如许多人指出的那样,企业库异常处理块是炸弹。使用策略,您可以执行诸如记录异常、将其包装在不同的异常中、抛出新异常而不是原始异常等事情。此外,如果您希望根据身份验证错误或重复记录错误等执行特定操作,您始终可以创建特定的派生异常类并捕获那些排除自上而下传递任何对象的需要的异常类型。异常应该总是向上冒泡而不是向下冒泡。

于 2009-04-07T03:51:24.497 回答
0

创建您自己的异常层。

DALExceptionManager DuplicateException 数据库异常

BLLExceptionManager NotAuthorizedException InvalidDateException

在您的表示层中,添加此引用并创建一个通用异常处理程序。这样你就知道如何处理异常消息了。

于 2009-10-05T02:19:37.513 回答