C# 擲回例外狀況(throw vs throw ex)

最近在SonarQube上遇到了一項Issue:

SonarQube認為在擲回exception時不要使用「throw ex」,使用「throw;」才可以保留堆疊追蹤的資訊,

秉持著實驗精神做了以下實驗:

首先在測試專案下寫一個方法負責丟出例外狀況

接著定義兩個不同方法分別呼叫CreateExceptionMethod
接著再定義兩個測試方法分別呼叫這兩個Case,Function1呼叫Case1, Function2呼叫Case2
接著執行測試並檢視輸出結果:
會發現呼叫使用 「throw;」的Case1的Function1可以追蹤到Line63,也就是最初產出exception的地方;
但Function2卻只能追蹤到Line57,也就是 「throw ex」,


這也代表若我們使用throw ex,則會將先前的堆疊資訊全部都捨棄,對於程式執行的偵錯會造成一些資訊的遺失,在下次使用類似的寫法時須多加注意。


Ref:
http://stackoverflow.com/questions/730250/is-there-a-difference-between-throw-and-throw-ex
http://scottdorman.github.io/2007/08/20/Difference-between-quotthrowquot-and-quotthrow-exquot-in-.NET/

發表留言