是否可以使用自定义堆栈跟踪抛出异常(可能是任何异常)?
作为一个具体的例子:假设我有一些可能引发异常的小型静态实用程序方法。但是,我希望异常看起来源自先前的方法而不是实用方法(我想忽略跟踪的第一帧)。
答案 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中完成)。