我有以下场景,我在业务层的数据访问代码中调用方法:
//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)当然,我可能会遗漏一些我很乐意了解的内容
这里应用程序架构的首选方法是什么?前两者之间是否存在功能差异?
答案 0 :(得分:2)
我建议第三个选项:将错误记录和错误显示放在UI图层中。
在您的用户界面中注册central error handler。在那里,你可以
显示错误(简单的MessageBox或带有&#34的花式窗口;更多详细信息&#34;以及&#34;向开发人员报告&#34;按钮)和
记录所有内容,
无需使用catch-all try-catch子句将每个 BL方法混乱。
这有很多好处:
答案 1 :(得分:0)
首先:始终抓住您可以处理的仅例外(See Eric Lippert Post)
您可以遵循以下策略:
try {} catch{}
。