代码之家  ›  专栏  ›  技术社区  ›  Joseph Daigle Sarabpreet Singh Anand

使用自定义堆栈跟踪引发异常

  •  9
  • Joseph Daigle Sarabpreet Singh Anand  · 技术社区  · 15 年前

    是否可以通过自定义堆栈跟踪引发异常(可以是任何异常)?

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

    2 回复  |  直到 15 年前
        1
  •  12
  •   James Cadd    15 年前

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

        2
  •  3
  •   Noldorin    15 年前

    乱搞堆栈跟踪听起来真的不是一个好主意,即使这是可能的(我对此表示怀疑)。告诉我,你为什么要这么做?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()
    

    ThrowArgumentOutOfRangeException 方法,并且它在堆栈跟踪中清晰可见。如果要使用 DebuggerNonUserCode 属性,那么这对我来说就足够公平了(尽管BCL中没有这样做)。