这个样本是好的样本使用try catch吗?什么是sugesstions?

时间:2016-09-22 10:30:26

标签: c# asp.net exception coding-style

对我来说这是一个悖论,我可以处理所有异常,还是让它去寻找并解决它。

我有一个窗口服务,它有几个像这样的方法:

这是不好的样本吗?

  public void BeginOperation() 
  {    
    try
    {
          DoSync();
    }    
    catch (Exception x){
          Log(x.message)
          Show(x.message);   
    }
  }


 public void DoSync() 
   {    
     try
     {
      GetSampleDatatable();
      ApplyDiff();
      CommitDiff();
    }    
    catch (Exception x){
      Log(x.message)
      throw x;  
    }
   }
  

DataLayer示例

   public DataTable GetSampleDatatable() 
   {    
        OracleDataTable myDataTable;
        try
        {
            myDataTable = new OracleDataTable(sqlStr, this);
            myDataTable.FetchAll = true;
            myDataTable.Active = true;
        }
        catch (Exception x)
        {
            this.ErrorMessage = x.Message;
            throw x;
        }
        return myDataTable;
    }

1 个答案:

答案 0 :(得分:1)

不,这不是一个好习惯。您可能会遇到异常的原因有几个:

  1. 您可以处理它并做出某些关于如何继续的决定
  2. 您希望向异常添加其他详细信息并让其冒泡
  3. 如果出现故障并不重要(这种情况非常罕见,您可能至少要记录它)
  4. 所以你的第一个代码块......

    public void BeginOperation() 
    {    
        try
        {
            DoSync();
        }    
        catch (Exception x)
        {
            Log(x.message)
            Show(x.message);   
        }
    }
    
    public void DoSync() 
    {    
        try
        {
            GetSampleDatatable();
            ApplyDiff();
            CommitDiff();
        }    
        catch (Exception x)
        {
            Log(x.message);
            throw x;  
        }
    }
    

    DoSync不属于任何这些类别。您正在记录错误,但BeginOperation也会记录错误,所以现在您已经有了冗余日志记录。重写,应该是这样的:

    public void BeginOperation() 
    {    
        try
        {
            DoSync();
        }    
        catch (Exception x)
        {
            Log(x.message);
            Show(x.message);   
        }
    }
    
    public void DoSync() 
    {    
        GetSampleDatatable();
        ApplyDiff();
        CommitDiff();
    }
    

    事实上,我怀疑DoSync是否有必要,你可以进一步简化这一点。但也许你有这样的组织理由。

    public void BeginOperation() 
    {    
        try
        {
            GetSampleDatatable();
            ApplyDiff();
            CommitDiff();
        }    
        catch (Exception x)
        {
            Log(x.message)
            Show(x.message);   
        }
    }
    

    现在是数据层。再次,你在这里遇到了一些问题。你正在捕捉异常,但你不能在这里处理它。抓住它没有意义。只需将错误冒泡到可以处理的地方(BeginOperation)。

    public DataTable GetSampleDatatable() 
    {    
        OracleDataTable myDataTable = new OracleDataTable(sqlStr, this);
        myDataTable.FetchAll = true;
        myDataTable.Active = true;
        return myDataTable;
    }
    

    此外,您正在使用throw ex;。这不是一个好的模式。您丢失了堆栈跟踪信息,这使您很难在IDE中快速确定发生异常的位置。只需使用throw;,它将保留堆栈跟踪信息。当然,当你因为我上面提到的三个原因而只捕捉异常时,这不应该经常发生。