2016-08-18 92 views
2

在和throw ex;之間選擇的最佳做法是什麼?有沒有呢?關於實施例 - - 對於這個簡單的代碼片段:如何拋出異常

try{ 
    // some code 
} catch (Exception ex) { 
    // some catcher code 
    // throw; ? 
    // or 
    // throw ex; ? 
    // how to decide which one? 
} 

UPDATE: 我知道上面的拖車之間的差異。問題是如何決定使用其中之一?有沒有最好的做法來做出更好的選擇?

+2

使用'throw',這會保留原始堆棧跟蹤。但爲什麼你會發現一個普遍的例外呢?在我看來,你無法處理它,爲什麼要抓住它? – Maarten

+0

@Maarten它有時會發生。重試一些操作,例如 –

+0

[有沒有區別「throw」和「throw ex」?](http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw -and-throw-ex) – Sinatr

回答

1

這是非常simple

您是否想要保持堆棧跟蹤來準確查看發生異常的位置?然後使用throw,這就好比你根本不使用catch

你只關心當前方法調試信息?然後throw ex

爲了證明:

static void Main(string[] args) 
{ 
    try 
    { 
     Test(); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
    } 
} 

static void Test() 
{ 
    try 
    { 
     // long lambda chain 
     new Action(() => new Action(() => new Action(() => { throw new InvalidOperationException(); })())())(); 
    } 
    catch (Exception ex) 
    { 
     //throw; 
     //throw ex; 
    } 
} 

throw將保持堆棧跟蹤:

System.InvalidOperationException: Operation is not valid due to the current state of the object. 
    at ConsoleApplication.Program.<>c.<Test>b__1_2() in ConsoleApplication\Program.cs:line 22 
    at ConsoleApplication.Program.<>c.<Test>b__1_1() in ConsoleApplication\Program.cs:line 22 
    at ConsoleApplication.Program.<>c.<Test>b__1_0() in ConsoleApplication\Program.cs:line 22 
    at ConsoleApplication.Program.Test() in ConsoleApplication\Program.cs:line 26 
    at ConsoleApplication.Program.Main(String[] args) in ConsoleApplication\Program.cs:line 13 

throw ex將重置堆棧跟蹤:

System.InvalidOperationException: Operation is not valid due to the current state of the object. 
    at ConsoleApplication.Program.Test() in ConsoleApplication\Program.cs:line 27 
    at ConsoleApplication.Program.Main(String[] args) in ConsoleApplication\Program.cs:line 13 

至於最佳實踐 - 的選擇通常爲throw,作爲開發者,你想獲得儘可能多的信息,throw ex是一個對應的 - 一些信息是隱藏的,但也許你想隱藏它,誰知道?

8

您應該使用throw;重新拋出原始異常(與原來的堆棧跟蹤),或使用throw new MyException(..., ex);拋出自己的異常,可能提供額外的信息,並設置內部異常能恩。

如果你沒有任何額外的信息只是用throw;

如果只捕捉到了異常做清理,然後用try {...} finally {...}代替。