2009-05-26 62 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