2009-05-26 60 views
8

是否可以使用自定義堆棧跟蹤拋出異常(可能是任何異常)?使用自定義堆棧跟蹤拋出異常

作爲一個具體的例子:可以說我有一些可能會拋出異常的小型靜態工具方法。不過,我希望這個異常看起來是源於前一種方法,而不是實用方法(我想忽略跟蹤的第一幀)。

回答

3

亂堆棧跟蹤聽起來並不是一個好主意,即使它是可能的(我對此抱有懷疑)。告訴我,你爲什麼要這麼做呢? .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中沒有完成)。

12

StackTrace屬性是虛擬的 - 創建您自己的派生Exception類並讓屬性返回您想要的任何內容。

+0

我會這樣做,除了我寧願拋出原來的異常類型。我不想把它作爲內在的例外來傳遞。 – 2009-05-26 20:16:53

+0

您可以從許多(也許是全部)正常異常中繼承自己的異常,因此您的自定義異常(使用自定義StackTrace)可能會被捕獲塊捕獲以獲得標準異常。 – supercat 2010-12-16 01:59:21