【问题标题】:How to properly handle errors in an n-tier application?如何正确处理 n 层应用程序中的错误?
【发布时间】:2010-12-02 15:09:31
【问题描述】:

从第一天起我就一直在努力解决这个问题。我被很多甚至根本不处理错误的代码所包围,这可能无济于事。

无论如何,我在您的传统 n 层设计中使用 WebForms:UI->BLL->DAL。通常我所做的(我知道这是不对的)是尝试/捕获我的数据操作。如果有异常,我只是把它扔掉。

try
'db operations
catch ex as exception
throw
finally
'close connections
end

然后它会冒泡到 BLL 并在其中进行另一个尝试/捕获,我将在其中记录错误。现在我想提醒用户出了点问题,所以我再次抛出它,这样它就会冒泡到 UI。在 UI 级别,我将封装在 try/catch 中,如果出现错误,我会向他们显示一条友好的消息。

你的想法是什么?我可以在这里做得更好吗?

【问题讨论】:

    标签: .net asp.net error-handling webforms


    【解决方案1】:

    与其他答案不同,我建议您也从您的 UI 中删除 try/catch。你的 BLL 应该捕获异常,记录它,然后为 UI 提供一些机制来查询发生了什么错误。

    这会使 UI 代码更加简洁,因为您不必枚举业务层可能抛出的所有可能异常。您可以将 UI 代码简化为:

    if (businessObject.doSomeOperation == true) {
       // Do whatever you need to here.
    } else {
       // output error message from businessobject
       // something like businessObject.LastErrorMessage();
    }
    

    【讨论】:

      【解决方案2】:

      您需要在 UI 中抛出异常并捕获,例如...在 BLL 中

      try
              {
                  //your code
              }
              catch (System.Data.SqlClient.SqlException ex)
              {
                  if (ex.Number == 547)
                  {
                      throw new Exception("ActiveRecord");
                  }
              }
              finally
              {
                  MasterConnection.Close();
              }
      

      在 UI 中查找执行并显示用户友好的消息。

       if (e.Exception != null)
          {
              if (e.Exception.InnerException.Message == "ActiveRecord")
              {
                  //Show here User freind message
              }
          }
      

      【讨论】:

        【解决方案3】:

        据我了解,您有三个 try/catch - 每层一个:DAL、BLL、UI。

        你应该只在你打算做某事的时候才抓住它。

        据我了解,您只是从 DAL 追溯,所以没有必要。

        您可以从 BLL 记录异常,这是一个很好的做法,因为您将能够收集有关异常的数据以最终改进应用程序。

        然后您在 UI 层捕获异常,将异常转换为用户友好的内容。没关系。

        所以我只会从 DAL 层中删除 try/catch - 如果您真的不做任何事情,除了追溯异常。

        在某些情况下,在 BLL 中添加一个标识符会很有用,该标识符传递给 UI 异常并显示给最终用户,这样如果他们致电支持,支持人员可以将给定的 Id 与异常相关联服务器的日志。

        这可以做到,例如,为 Exception.Data 集合添加一个 Guid 或其他有意义且唯一的东西。

        【讨论】:

        • 但是如果DAL中出现错误,我不是必须关闭连接以防止泄漏吗?
        • 如果您使用“Using”语句,则无需显式尝试/捕获 DAL。在幕后,“使用”将用 try/finally 包装您的连接/命令,并在 finally 中关闭它们。
        猜你喜欢
        • 2017-01-04
        • 2012-04-04
        • 2018-02-04
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        • 2012-04-30
        • 2016-01-01
        • 2011-12-04
        相关资源
        最近更新 更多