【问题标题】:How to handle exceptions in tiered architecture?如何处理分层架构中的异常?
【发布时间】:2023-03-08 18:23:01
【问题描述】:

在你跑去谷歌之前,我已经阅读了很多关于异常处理的文章、帖子和 cmets,但我仍然停留在这些特定点上。

鉴于以下示例,您将如何处理以下场景?

  1. 如果 DAL 层中发生异常并被包装在自定义异常中以提供更多信息并更好地对其进行分类。我如何记录它?

如果我在 DAL 层中记录它,它将在全局处理程序中再次记录(使用 elmah)。我可以让它传播,但是如果 ServiceLayer 需要将该异常转换为对用户更友好的消息或可能用于事务目的(想想回滚),会发生什么?我将丢失在 DAL 异常中收集的信息(无论如何都是消息,不一定是堆栈跟踪)。

 // UI
        public static GetUser(int userId)
        {
            // Should I do validation here or in service layer
            try
            {
               IUserService s = new UserService(userId);
               s.GetUser(userId);
            } 
            catch(ServiceLayerException ex)
            {
                // ex.Message displayed to user
            }

        }


        // Service layer
        public User GetUser(int userId)
        {           
            try
            {
                return repo.GetUser(userId);
            }
            catch(DALException ex)
            {
                // user-friendly message displayed to user
                throw new ServiceLayerException("User does not exist");
            }
        }



        // DAL
        public User GetUser(int userId)
        {
            try
            {
                // Query for user, if fails throw DALException
                return userId;
            }
            catch (SqlException ex)
            {
                throw new DALException("Could not retrieve user with userId " + userId.ToString());
            }

        }

【问题讨论】:

    标签: exception exception-handling layer n-tier-architecture


    【解决方案1】:

    就我个人而言,我更喜欢在实际发生异常的地方登录,所以在第一种情况下,我会登录 DAL。如果我们不想传播错误,Bal(服务层)可以处理错误,或者允许 elmah 记录它(这不是一件坏事,因为它会显示在错误页面上并帮助跟踪异常)。 服务层还可以将 DAL 错误作为内部异常传递,以便在传播期间/传播后如果需要可以访问它 - 并且异常 iteslf 可以根据需要在层之间进行变异。用户通常不会想要这样的信息,而只会收到通常的简化消息。 也可以使用事件来收集异常数据(带有专门的事件争论)并只传回布尔方法返回,这可以更可控和可定制 - 尽管这会让你有责任传播或不传播,而且很可能仅用于“预期”异常。

    【讨论】:

    • 专门登录 DAL 或任何层的事情是我冒着多次记录相同异常的风险。假设我有一个非常通用的 DAL 方法,该方法从许多不同的服务中调用,在某些情况下服务层可以处理异常,而在其他情况下则不能,因此异常传播到全局处理程序并被记录两次。
    • 是的,但这里需要权衡取舍。如果您只是捕获 DAL 中的错误数据并返回服务层,并带有异常数据但没有异常(即在 DAL 中处理),那么在该异常被向下传递和异常被中间问题隐藏(这可能发生在内存异常中,例如可能导致无法处理的 - 在应用程序中 - 错误)。这也是使用 elmah 等通用错误报告系统的代价。
    • 您需要权衡丢失因果异常的风险是否超过了下游层中错误处理不当的可能性。另一种可能性是使用日志服务并从您的层调用它并在那里构建业务逻辑来决定是否记录/重新记录或删除重复项 - 然后根本不用担心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2022-10-13
    • 2013-10-15
    相关资源
    最近更新 更多