代码之家  ›  专栏  ›  技术社区  ›  Mendes

N层/N层错误处理设计

  •  0
  • Mendes  · 技术社区  · 12 年前

    我们的团队正在构建一个N层应用程序,该应用程序将处理许多数据库和网络方法。

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

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

    除此之外,我们还可以有一个表示层(ASP.NET应用程序)、一个直接调用业务函数的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属性是可本地化的,具体取决于之前设置的应用程序区域性。

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

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

    所有业务方法之间的解决方案必须是统一的。

    你认为最好的方法是什么以及如何实施。

    2 回复  |  直到 12 年前
        1
  •  1
  •   Juanito Bassam Alugili    10 年前

    你做错了什么,但看看这些信息,我是从微软企业库获得的

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

    包裹处理程序。 这个异常处理程序将一个异常包裹在另一个异常周围。

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

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

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

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

    我建议您使用Microsft Enterprise库。

    Exception Handling in MEL 6.0

        2
  •  0
  •   Community Mohan Dere    8 年前

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

    我一直在使用 Elmah 记录异常,现在有一段时间了,我完全建议这样做。

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

    希望它能有所帮助!