2012-08-13 36 views
4

可能重複:
What is the proper way to re-throw an exception in C#?爲什麼要「扔掉」;隱藏原來的堆棧跟蹤

我想知道爲什麼「扔恩」的使用隱藏了原來的堆棧跟蹤?設計c#編譯器時背後的基本哲學是什麼?

+3

您是否意識到可以使用'throw;'如果您想重新拋出原始異常以及原始堆棧跟蹤的事實? – Adam 2012-08-13 09:25:42

+0

@codesparkle是的,我知道「扔」用法。但我只想了解原因? – mkus 2012-08-13 09:26:18

+0

在這種情況下,你真的不知道你在問什麼。 「爲什麼有一個新的堆棧跟蹤拋出的命令」?因爲設計師認爲這樣的事情足以證明構建它的成本<===但這是每個這樣的問題的答案,使它不是特別有啓發性。你真的想知道什麼? – AakashM 2012-08-13 09:30:13

回答

9

這實際上並不是一個C#問題,而是一個CLI設計問題,歸結爲不同的IL指令,throwrethrow

基本上,throw ex;(對於任何ex,即使原來的)是IL throw,其中-作爲throw;是IL rethrow

如果你指定一個特定的異常拋出,那麼這個異常在邏輯上來自這裏,現在,這個方法。如果不是的話,則:

throw; 

而非throw ex;,或者:包裝在另一個異常異常,所以你保留原來的異常顯示在新的來了從:

throw new SomeException(ex); 

在這種情況下,主叫方可以通過ex.InnerException獲得原始堆棧跟蹤。

+0

謝謝Marc。 – mkus 2012-08-13 09:40:11

+0

「扔前」是一種刑事犯罪「[很吸引人](http://stackoverflow.com/questions/178456/what-is-the-proper-way-to-re-throw-an-exception-in- c)但它沒有描述_why_它是犯罪的。你對IL的「throw」和「rethrow」的解釋幫助我理解。謝謝。 – twip 2014-08-02 02:55:36

0

當你捕捉到一個異常時,它的「出生地」就在其他地方,並且這個異常將堆棧追蹤傳送到它被拋出的地方。將其視爲throw初始化Exception類的實例的堆棧跟蹤。因此throw ex;用當前堆棧初始化ex的堆棧跟蹤。

相關問題