尝试捕获块位置

时间:2015-06-21 13:37:07

标签: c# try-catch

我有以下场景,我在业务层的数据访问代码中调用方法:

//Call the method from BL
SqlHandler sh = new SqlHandler();
var names = sh.GetNames();

DAL中的方法示例:

public IEnumerable<string> GetNames()
{
    string conString = GetOpenConnection();
    using (SqlConnection connection = new SqlConnection(conString))
    {
        connection.Open();
        using(SqlCommand cmd = new SqlCommand("SELECT Name From Names"))
        {
            //...
        }
    }
}

我需要记录我的DAL中发生的任何异常,并使用适当的消息向用户显示消息。据我所知,我有以下选择:

1)仅围绕BL呼叫并记录并显示来自那里的消息:

try
{
    SqlHandler sh = new SqlHandler();
    var names = sh.GetNames();
}
catch (Exception ex)
{
    ex.LogException();
    MessageBox.Show(ex.Message);
}

2)围绕两个呼叫并将记录部分和通知部分分成两部分:

try
{
    SqlHandler sh = new SqlHandler();
    var names = sh.GetNames();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

public IEnumerable<string> GetNames()
{
    try
    {
        string conString = GetOpenConnection();
        using (SqlConnection connection = new SqlConnection(conString))
        {
            connection.Open();
            using (SqlCommand cmd = new SqlCommand("SELECT Name From Names"))
            {
                //...
            }
        }
    }
    catch (Exception ex)
    {
        ex.LogException();
        //propagate the exception to the caller
        throw;
    }
}

3)当然,我可能会遗漏一些我很乐意了解的内容

这里应用程序架构的首选方法是什么?前两者之间是否存在功能差异?

2 个答案:

答案 0 :(得分:2)

我建议第三个选项:将错误记录和错误显示放在UI图层中。

在您的用户界面中注册central error handler。在那里,你可以

  • 显示错误(简单的MessageBox或带有&#34的花式窗口;更多详细信息&#34;以及&#34;向开发人员报告&#34;按钮)和

  • 记录所有内容,

无需使用catch-all tr​​y-catch子句将每个 BL方法混乱。

这有很多好处:

  • 它将使您的BL代码更易于阅读。
  • 你不能忘记 BL方法。
  • 更容易对错误处理代码进行(集中)更改。
  • 您不会将业务逻辑耦合到特定类型的用户界面,这本身就有很多优点:例如,您可以稍后在基于Web的项目中重复使用它,并且您可以测试您的业务逻辑使用单元测试

答案 1 :(得分:0)

首先:始终抓住您可以处理的例外(See Eric Lippert Post
您可以遵循以下策略:

  • 如果无法从异常中恢复,请仅在DAL层中执行并记录它。
  • 如果用户可以处理它,则在BAL层中
  • try {} catch{}