【问题标题】:N-Layer/N-Tier error handling designN-Layer/N-Tier 错误处理设计
【发布时间】:2013-08-27 10:27:27
【问题描述】:

Out 团队正在构建一个可以处理大量数据库和网络方法的 N 层应用程序。

基本上我们设计了以下层(从下到上):

数据层:可以是 Oracle 或 SQL(基本上是使用 Database First 自动生成的 EF 实体和上下文) 持久层:处理数据层。我们有一个用于 Oracle 的持久层和另一个用于 SQL 的层,它们之间有一些小的变化(我们希望将来重构它以拥有一个单一的代码 - 接受想法)。 业务层:这是处理特定的应用程序逻辑。

在上面我们可以有一个表示层(ASP.NET App),一个直接调用业务功能的API,一个允许来自网络的业务请求的网络代理等等。

我们对错误处理机制存有疑问。我们决定所有异常都在业务层受到威胁,所以这是我唯一有 try/catch 语句的地方。

我们的观点是我们不希望应用用户摆脱异常,但他们需要知道操作的状态。我们创建了一个 ReturnStatus 类,如下所示:

public class ReturnStatus
{
    public enum ReturnStatusTypes : int { Success, Failure, Unknown }

    public ReturnStatusTypes Status;
    public int MessageCode;
    public string Message;

    /// <summary>
    /// Class constructor
    /// </summary>
    public ReturnStatus()
    {
        Status = ReturnStatusTypes.Unknown;
        MessageCode = 0;
        Message = "";
    }

    /// <summary>
    /// Class constructor
    /// </summary>
    /// <param name="status">Status</param>
    /// <param name="message">Message</param>
    public ReturnStatus(ReturnStatusTypes status, int msgCode)
    {
        Status = status;
        MessageCode = msgCode;
        Message = ErrorMessages.ResourceManager.GetString("ErrorCode" + msgCode);
    }
}

Message 属性可根据之前设置的 App 文化进行本地化。

我们希望对业务层方法的每个调用都有一个 ReturnStatus。这可以登录到 ASP.NET 状态栏,返回到 API 或通过网络发送到其他应用程序。问题是我们的大多数业务类都返回数据,因此我们需要找到一种方法将状态和数据一起返回给消费参与者。

我们的员工正在考虑: a) 在每次调用时使用元组。这似乎不是推荐的方式。 b) 抛出一个期望:不符合我们的架构。 c) 在每次调用时使用 ReturnStatus:被认为是一种选择,即使看起来很老式。 d) 在某处保存最后一个错误对象,以便调用可以直接返回数据,用户可以调用 lastactionstatus 来获取此错误。我们的观点是:我们不知道在哪里存储最后的错误数据。在单例类上?

解决方案必须在所有业务方法之间保持一致。

您会推荐什么最佳方法以及如何实施。

【问题讨论】:

    标签: c# asp.net architecture error-handling n-tier-architecture


    【解决方案1】:

    你做错了,但是看看我从微软企业库中得到的这个信息

    使用异常处理程序 异常处理应用程序块旨在支持应用程序组件中的 catch 语句中包含的典型代码。应用程序块允许开发人员将此逻辑封装为可重用的异常处理程序,而不是在应用程序组件中的相同 catch 块中重复此代码(例如记录异常信息)。异常处理程序是封装异常处理逻辑并实现名为 IExceptionHandler 的异常处理应用程序块接口的 .NET 类。异常处理应用程序块包括四个异常处理程序:

    包装处理程序。此异常处理程序将一个异常包装到另一个异常。

    替换处理程序。此异常处理程序将一个异常替换为另一个。

    日志处理程序。此异常处理程序格式化异常信息,例如消息和堆栈跟踪。然后日志记录处理程序将此信息提供给企业库日志记录应用程序块,以便发布。

    故障合同异常处理程序。此异常处理程序设计用于 Windows Communication Foundation (WCF) 服务边界,并从异常生成新的故障协定。

    非常重要,如果您有另一个进程,例如从设备读取并在主线程(UI)中定位错误消息,主线程也必须捕获所有异常。

    我建议您使用 Microsft Enterprise 库。

    Exception Handling in MEL 6.0

    【讨论】:

    • 我们知道如何处理异常。这不是问题或问题。我们的问题是关于我们应该在用户层使用什么方法,因为我们不想传播异常处理程序。
    • 我想知道这个 gona 是否有效每次这是一种非常古老的编程风格并且大多数 C 和 C++ 程序员仍在嵌入式系统中使用它时,您都必须检查状态。我只是强烈建议你在你的架构中重新启动异常处理,你永远不会让这个系统稳定,或者我可能因为我没有源代码和你的软件中的整个错误处理工作流程而遗漏了一些东西,而只是凭感觉。跨度>
    • 同意。返回码只是感觉不对。我认为让异常跨层浮出水面没有问题。你遇到了返回码的问题——因为你返回了一个码,你不能返回数据,所以你的方法需要你outref。让异常发生并在最后一层适当地处理它们。
    【解决方案2】:

    Here 您可以查看一些关于异常抛出的指南,also 需要考虑一些性能问题。

    我已经使用Elmah 记录异常有一段时间了,我完全推荐它。

    Exception handling with Elmah可以给你一个提示,如何使用它。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-09
      • 2021-05-27
      • 1970-01-01
      • 2012-11-12
      • 2019-10-24
      • 1970-01-01
      • 2015-12-24
      • 2010-10-18
      相关资源
      最近更新 更多