我在DataAccess Layer上有以下方法: 它很好但是在Try Catch上如果有错误或SQL Exception我正在记录它但是如果异常它将返回null到业务逻辑层。但我想处理它,如果有错误,它应通知业务逻辑层有关错误。我知道怎么能这样做。
public DataTable PapoulateIndexAnalyssList()
{
DataTable dt;
dt = new DataTable();
try
{
this.indiceTableAdapter.FillBy(this.ds_IndexAnalysis.Indice);
dt = this.tmp_Table_Analisi_IndexTableAdapter.GetData();
}
catch(Exception ex)
{
//Logging Error:
errorMessageVieReportDAL = ex.Message;
Logs.WriteLog(errorMessageVieReportDAL);
ObjResults.SetFailure = false;
ObjResults.GetErrorMessage = errorMessageVieReportDAL;
}
return dt;
}
答案 0 :(得分:1)
您在try / catch之前实例化DataTable
,因此它不会是null
,它将为空。
如果你使用了它,那么它就是null
,如果你觉得调用方法的足够信息能够确定PapoulateIndexAnalyssList
失败了。
DataTable dt = null;
对错误采取行动(例如记录它)是可以接受的,但是然后重新抛出它以便链上的方法也知道它,这可能是处理它的正确方法。
catch (Exception ex)
{
//Logging Error:
errorMessageVieReportDAL = ex.Message;
Logs.WriteLog(errorMessageVieReportDAL);
ObjResults.SetFailure = false;
ObjResults.GetErrorMessage = errorMessageVieReportDAL;
throw ex;
}
如果调用方法需要有一个空表,那么这就是调用方法的关注点,而不是PapoulateIndexAnalyssList
。调用方法应该在它自己的catch
块中处理它(在我看来)。
DataTable dt;
try
{
dt = someClass.PapoulateIndexAnalyssList();
}
catch
{
dt = new DataTable();
}
答案 1 :(得分:0)
如果数据访问层内发生错误,则不应返回null
或new DataTable()
,在找不到记录或发生错误之间,它将不明确。您需要从数据访问层重新抛出异常
catch(Exception ex)
{
//Logging Error:
errorMessageVieReportDAL = ex.Message;
Logs.WriteLog(errorMessageVieReportDAL);
ObjResults.SetFailure = false;
ObjResults.GetErrorMessage = errorMessageVieReportDAL;
throw;
}
并在表示层中捕获相同的异常,然后显示一些用户友好的错误消息,以便用户知道发生了错误。
表示层中的代码:
DataTable dt = null;
try
{
dt = BLL.PapoulateIndexAnalyssList();
}
catch
{
// code to show user friendly error message here
}
答案 2 :(得分:0)
如果您坚持不重新抛出异常,您始终可以将结果包装在响应对象中 调用代码必须检查结果是否处于错误状态 您的代码看起来像这样:
public QueryResult{
public DataTable Data{get;set;}
public bool Error{get;set;}
public string ErrorMessage{get;set;}
}
public QueryResult PapoulateIndexAnalyssList()
{
var result = new QueryResult();
result.Data = new DataTable();
try
{
this.indiceTableAdapter.FillBy(this.ds_IndexAnalysis.Indice);
result.Data = this.tmp_Table_Analisi_IndexTableAdapter.GetData();
}
catch(Exception ex)
{
//Logging Error:
errorMessageVieReportDAL = ex.Message;
Logs.WriteLog(errorMessageVieReportDAL);
ObjResults.SetFailure = false;
ObjResults.GetErrorMessage = errorMessageVieReportDAL;
result.Error = true;
result.ErrorMessage = ex.Message;
}
return result;
}