C# 三层体系结构中的错误处理

C# 三层体系结构中的错误处理,c#,error-handling,n-tier-architecture,C#,Error Handling,N Tier Architecture,如何优雅地实现错误处理?例如,我的数据访问层可能引发两种类型的错误: 1) 未授权访问,在这种情况下,页面应该隐藏所有内容,只显示错误消息 2) 通知用户数据库中已经存在类似的错误(例如,名称不唯一),在这种情况下,我不想隐藏所有内容 编辑: 由于这里的一些评论,我设计了应该创建派生的专用异常类型,例如NotAuthorizedException、DuplicateException等。。。。这一切都很好,但我可以看到潜在的两个问题: 1) 每个存储过程都有一个返回字段p_error,其中包含一

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

编辑:

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

1) 每个存储过程都有一个返回字段p_error,其中包含一条错误消息。从DB获取数据后,我需要检查此字段以查看返回的错误类型,以便抛出适当的异常。因此,我仍然需要将我的错误类型/错误消息存储在某个位置……换句话说,我应该如何将准确的消息发送给用户(在某些时候我需要),而不首先检查p_错误字段。这让我回到错误对象。有人吗

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

我是不是遗漏了什么


非常感谢大家

您应该在中签出异常处理块。围绕包装异常和在层之间传递异常的许多好技巧和代码。

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

我在考虑的一个选择 正在使用创建错误类,但 然后我需要从UI传递它 到业务层,然后到数据 参照访问层

我不确定我是否理解这一点。您不必在每个层中传递错误对象。例如,在您的一个示例中,
错误通知用户数据库中已经存在类似的内容(例如,名称不唯一)
,框架可能会引发sql异常,您只需要在业务层或UI层捕获特定异常


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

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


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

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

创建自己的异常层

DaleExceptionManager 重复异常 数据库异常

BLLExceptionManager 未授权的数据接收 InvalidDateException

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

授权是通过数据库完成的,这不在我的控制范围内,因此我需要一种方式将其从DAL优雅地传递到UI。其次,需要根据数据库验证一些用户输入。在这种情况下,DAL将返回一个错误到业务层,我需要再次优雅地将其呈现给UI。我有一个想法,但我想看看其他人都做了什么。我同意业务层的想法。。。这就是我在我的帖子里想要表达的。。。但是,无论您以何种方式可以在UI中捕获异常,您都不必定义自己的异常类型来捕获某些内容。是的,我得到了这么多:)但我需要一种方法来区分致命错误(例如无法访问)和数据验证错误,当然,除了检查错误消息之外。有更好的方法吗?有两种方法表示错误,错误代码或异常。我不确定您是否有权访问每一层,但您可以将错误代码包装在exception类中并抛出它。然后在一个地方捕获所有异常。简单而优雅,我实际上实现了这样的东西。唯一不好的一面是要包含额外的引用