Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个样品是不是很好用的样品?什么';什么建议?_C#_Asp.net_Exception_Coding Style - Fatal编程技术网

C# 这个样品是不是很好用的样品?什么';什么建议?

C# 这个样品是不是很好用的样品?什么';什么建议?,c#,asp.net,exception,coding-style,C#,Asp.net,Exception,Coding Style,这对我来说是一个悖论,我能处理所有的异常还是让它去发现并解决它 我有一个WindowsService,它有以下几种方法: public void BeginOperation() { try { DoSync(); } catch (Exception x) { Log(x.message); Show(x.message); } } public void DoSync()

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

我有一个WindowsService,它有以下几种方法:

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

public void DoSync() 
{    
    GetSampleDatatable();
    ApplyDiff();
    CommitDiff();
}
这是坏样品吗

  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;  
    }
   }
数据层示例


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

  • 你可以处理它,并就如何进行做出某种决定
  • 您希望向异常添加额外的细节,并让它冒泡
  • 如果某件事情失败了,这并不重要(这是非常罕见的,您可能至少要记录它)
  • 所以你的第一个代码块

    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
    不属于这些类别。您正在记录错误,但是
    开始操作
    也会记录错误,因此现在您有了冗余的日志记录。重写后,应该是这样的:

    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


    此外,您正在使用
    throw-ex。这不是一个好模式。您会丢失堆栈跟踪信息,这使得IDE很难快速确定异常的来源。只需使用
    throw,它将保留堆栈跟踪信息。当然,当您仅仅因为我上面提到的三个原因而捕获异常时,这种情况不应该经常发生。

    您在这里遇到的最大问题是,您一直都在捕获所有异常,只需使用
    捕获异常
    。仔细想想哪些异常可能会发生,然后就可以清楚地知道在哪里可以捕捉到哪些异常(如果捕捉到它们的话)。我知道,对于这个示例,什么是处理异常的最佳方法,你能简单地说一下吗这会弄乱堆栈跟踪!只需使用
    throw。这里有一点很重要:只有在您能够处理异常时才能捕获它。如果你不能处理这个问题,那就不要在那里抓住它。让它变成可以的东西吧。谢谢@mason的回复
    
    public DataTable GetSampleDatatable() 
    {    
        OracleDataTable myDataTable = new OracleDataTable(sqlStr, this);
        myDataTable.FetchAll = true;
        myDataTable.Active = true;
        return myDataTable;
    }