【问题标题】:Error Handling in 3 layered architecture3 层架构中的错误处理
【发布时间】:2009-04-06 23:56:25
【问题描述】:

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

编辑:

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

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

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

我错过了什么吗?

非常感谢大家!

【问题讨论】:

    标签: c# error-handling n-tier-architecture


    【解决方案1】:

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

    【讨论】:

    • 您可以在 UI 中捕获异常,您不必定义自己的异常类型来捕获某些内容。
    【解决方案2】:

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

    【讨论】:

    • 授权是通过数据库完成的,这不在我的控制范围内,所以我需要一种方法来优雅地将它从 DAL 传递到 UI。其次,一些用户输入需要针对数据库进行验证。在这种情况下,DAL 将向业务层返回一个错误,我需要再次优雅地将其呈现给 UI。
    • 我想到了一种方法,但我想看看其他人做了什么。
    • 我同意业务层的想法......这就是我试图在我的帖子中传达的......但无论如何
    【解决方案3】:

    创建您自己的异常层。

    DALExceptionManager 重复异常 数据库异常

    BLLExceptionManager 未授权异常 无效日期异常

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

    【讨论】:

    • 简单而优雅,我实际上实现了这样的东西。唯一的缺点是要包含的额外引用
    【解决方案4】:

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

    【讨论】:

    • 是的,我得到了这么多:) 但我需要一种方法来区分致命错误(例如无法访问)和数据验证错误,当然除了检查错误消息。有更好的方法吗?
    • 有两种方式来表示错误,错误代码或异常。我不确定您是否可以访问每一层,但您可以将错误代码包装在异常类中并抛出它。然后在一个地方捕获所有异常。 HTH。
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-30
        • 2011-09-30
        • 2010-12-09
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 2012-11-13
        • 2017-01-27
        相关资源
        最近更新 更多