繁体   English   中英

3层架构中的错误处理

[英]Error Handling in 3 layered architecture

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

编辑:

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

1)每个存储过程都有一个返回字段p_error,其中包含一条错误消息。 从DB获取数据后,我需要检查此字段以查看已返回的错误类型,因此我可以抛出适当的异常。 所以,我仍然需要在某处存储我的错误类型/错误消息.....换句话说,我应该如何向用户发送确切的消息(在某​​些时候我需要),而不是先检查p_error字段。 什么让我回到错误对象。 任何人?

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

我在这里错过了什么吗?

非常感谢大家!

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

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

创建自己的异常图层。

DALExceptionManager DuplicateException DatabaseException

BLLExceptionManager NotAuthorizedException InvalidDateException

在Presentation Layer中,添加此引用并创建一个公共异常处理程序。 通过这种方式,您知道如何处理异常消息。

我正在考虑使用的一个选项是创建一个Error类,但是我需要将它从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文件中定义一些基于策略的异常处理。 如果你想开发一些企业应用程序,它可能是个好地方。 但是对于简单的应用程序,您可能不需要那么远。

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

请记住,错误状态值和这些事情是我们发明异常的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM