异常时出现错误消息。

时间:2014-02-12 13:07:07

标签: c#

我在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;
}

3 个答案:

答案 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)

如果数据访问层内发生错误,则不应返回nullnew 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;
}