這是非常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
是一個對應的 - 一些信息是隱藏的,但也許你想隱藏它,誰知道?
使用'throw',這會保留原始堆棧跟蹤。但爲什麼你會發現一個普遍的例外呢?在我看來,你無法處理它,爲什麼要抓住它? – Maarten
@Maarten它有時會發生。重試一些操作,例如 –
[有沒有區別「throw」和「throw ex」?](http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw -and-throw-ex) – Sinatr