是否可以使用自定義堆棧跟蹤拋出異常(可能是任何異常)?使用自定義堆棧跟蹤拋出異常
作爲一個具體的例子:可以說我有一些可能會拋出異常的小型靜態工具方法。不過,我希望這個異常看起來是源於前一種方法,而不是實用方法(我想忽略跟蹤的第一幀)。
是否可以使用自定義堆棧跟蹤拋出異常(可能是任何異常)?使用自定義堆棧跟蹤拋出異常
作爲一個具體的例子:可以說我有一些可能會拋出異常的小型靜態工具方法。不過,我希望這個異常看起來是源於前一種方法,而不是實用方法(我想忽略跟蹤的第一幀)。
亂堆棧跟蹤聽起來並不是一個好主意,即使它是可能的(我對此抱有懷疑)。告訴我,你爲什麼要這麼做呢? .NET框架本身(BCL)經常使用靜態工具方法來拋出異常,按照您的建議(至少在框架的某些部分是ThrowHelper
),它肯定會隱藏堆棧跟蹤中的任何內容。
下面是一個測試,我只是跑了一個例子堆棧跟蹤:
at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) at System.ThrowHelper.ThrowArgumentOutOfRangeException() at System.Collections.Generic.List`1.get_Item(Int32 index) at HelloWorld.Program.Main(String[] args) in C:\...\Program.cs:line 23 at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()
正如你所看到的,BCL使用ThrowArgumentOutOfRangeException
方法,它是在堆棧跟蹤清晰可見。如果您想用DebuggerNonUserCode
屬性標記幫助器方法,那麼對我來說這似乎夠公平(儘管它在BCL中沒有完成)。
StackTrace屬性是虛擬的 - 創建您自己的派生Exception類並讓屬性返回您想要的任何內容。
我會這樣做,除了我寧願拋出原來的異常類型。我不想把它作爲內在的例外來傳遞。 – 2009-05-26 20:16:53
您可以從許多(也許是全部)正常異常中繼承自己的異常,因此您的自定義異常(使用自定義StackTrace)可能會被捕獲塊捕獲以獲得標準異常。 – supercat 2010-12-16 01:59:21