如何优雅地实现错误处理?例如,我的数据访问层可能会抛出两种类型的错误: 1)未授权访问,在这种情况下,页面应隐藏所有内容,只显示错误消息 2)错误告知用户数据库中已经存在这样的东西(比如名称不是唯一的 - 例如),在这种情况下我不想隐藏所有内容。
编辑:
由于这里的一些评论,我设计了我应该创建派生的专用异常类型,例如NotAuthorizedException,DuplicateException等等......这一切都很好而且花花公子,但是我可以看到2个问题:
1)每个存储过程都有一个返回字段p_error,其中包含一条错误消息。从DB获取数据后,我需要检查此字段以查看已返回的错误类型,因此我可以抛出适当的异常。所以,我仍然需要在某处存储我的错误类型/错误消息.....换句话说,我应该如何向用户发送确切的消息(在某些时候我需要),而不是先检查p_error字段。什么让我回到错误对象。任何人吗?
2)我可能会变成一场噩梦,其中异常数量等于错误消息类型的数量。
我在这里错过了什么吗?
非常感谢大家!
答案 0 :(得分:4)
您应该查看Enterprise Library中的异常处理块。很多关于包装异常并在层之间传递异常的好技巧和代码软件。
答案 1 :(得分:3)
您的业务层在哪里,为什么不检查授权和完整性? DAL太低了,无法检查这些规则 - 如果你遇到问题,那么抛出异常的时候已经快了。您的业务层或控制器可以捕获该异常,并显示合理的消息 - 但这不是您应该经常做的事情。
答案 2 :(得分:0)
我在想的一个选择 using是创建一个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文件中定义一些基于策略的异常处理。如果你想开发一些企业应用程序,它可能是个好地方。但是对于简单的应用,你可能不需要那么远。
答案 3 :(得分:0)
上层中发生的事情不在您的数据访问层之上。它甚至不应该知道上层将要做什么。如果你有一个重复的键错误,那么它应该抛出类似“DuplicateKeyException”的东西。如果你应该发出授权错误(我认为你的意思是“异常”),那么不要对它做任何事情 - 让它回到UI层,这可以显示一个合适的错误页面。
请记住,错误状态值等等是我们发明异常的原因。
答案 4 :(得分:0)
企业库异常处理块是许多人指出的炸弹。使用策略,您可以执行诸如记录异常,将其包装在另一个异常中,抛出新异常而不是原始异常。此外,如果您希望基于身份验证错误或重复记录错误等执行特定操作,您可以始终创建特定的派生异常类并捕获这些异常类型,这将排除从顶部向下传递任何对象的需要。例外应该总是冒泡而不是下降。
答案 5 :(得分:0)
创建自己的例外图层。
DALExceptionManager DuplicateException DatabaseException
BLLExceptionManager NotAuthorizedException InvalidDateException
在Presentation Layer中,添加此引用并创建一个公共异常处理程序。 通过这种方式,您知道如何处理异常消息。