2016-09-22 128 views
1

它對我來說是一個悖論,我可以處理所有異常或讓它去尋找並解決它。這個樣本是否適合使用try catch?什麼是sugesstions?

我有一個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; 
    } 
    } 

數據層樣品

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

這裏最大的問題是,你只需要用'catch Exception'捕獲所有異常。仔細想想哪些異常會發生,然後它會變得清晰在哪裏捕捉哪些(如果趕上它們) – Andrei

+0

我明白,這個示例的最佳句柄例外是什麼,你可以很快告訴它 – Mennan

+1

不要使用'拋出x;'弄亂你的堆棧跟蹤!只需使用'throw;'。這裏有一個重要的觀點:只有在可以處理它的時候纔會發現異常*。如果你不能處理這個問題,那麼不要在那裏處理它。讓它冒泡到可以的東西。 – mason

回答

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;,它將保留堆棧跟蹤信息。當然,當你僅僅因爲我上面提到的三個原因而捕獲異常時,這不應該經常發生。

+0

感謝@mason回覆 – Mennan

相關問題