这个样品可以用来试捕吗?你们# 39;s的提议

本文关键字:你们 | 更新日期: 2023-09-27 18:08:29

这对我来说是一个悖论,我能处理所有的异常还是让它去寻找和解决它

我有一个windowservice,它有如下几个方法:

这是坏样品吗?

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

这个样品可以用来试捕吗?你们# 39;s的提议

不,这不是一个好的做法。有几个原因可能会导致您捕获异常:

  1. 你可以处理它并决定如何继续
  2. 你想给异常添加额外的细节,让它冒泡
  3. 如果某些东西失败了没关系(这是非常罕见的,你可能至少想要记录它)

第一个代码块....

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;,它将保留堆栈跟踪信息。当然,如果您只是因为上面提到的三个原因而捕获异常,那么这种情况不应该经常发生。