使用自定义堆栈跟踪抛出异常

时间:2009-05-26 19:59:55

标签: .net language-agnostic exception

是否可以使用自定义堆栈跟踪抛出异常(可能是任何异常)?

作为一个具体的例子:假设我有一些可能引发异常的小型静态实用程序方法。但是,我希望异常看起来源自先前的方法而不是实用方法(我想忽略跟踪的第一帧)。

2 个答案:

答案 0 :(得分:12)

StackTrace属性是虚拟的 - 创建您自己的派生Exception类,并让属性返回您想要的任何内容。

答案 1 :(得分: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中完成)。