如何告诉编译器忽略堆栈跟踪中的方法?

Amy*_*Amy 9 .net c# exception stack-trace

是否有任何属性可以应用于样板方法,以便这些方法不会出现在堆栈跟踪中?我有很多它们,在某些情况下它们有几个层次.这只是混乱的事情.

示例代码:

class Program
{
    public static void ThrowMe()
    {
        throw new NotImplementedException();
    }

    public static void HideMe()
    {
        ThrowMe();
    }
    static void Main(string[] args)
    {
        try
        {
            HideMe();
        }
        catch (Exception e)
        {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将抛出此堆栈跟踪:

在Spork.Program.ThrowMe()在C:\ Projects\XXX\Testing Sandbox\ConsoleTesting\Program.cs:第58行

在Spork.Program.HideMe()在C:\ Projects\XXX\Testing Sandbox\ConsoleTesting\Program.cs:第64行

在Spork.Program.Main(String [] args)中的C:\ Projects\XXX\Testing Sandbox\ConsoleTesting\Program.cs:第70行

Han*_*ant 7

将Console.WriteLine(e)放在catch块中.切换到发布版本并按Ctrl + F5.你会看到这个:

System.NotImplementedException: The method or operation is not implemented.
   at ConsoleApplication1.Program.ThrowMe() in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 9
   at ConsoleApplication1.Program.Main(String[] args) in C:\Users\hpassant\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs:line 17 
Run Code Online (Sandbox Code Playgroud)

请注意,HideMe()方法在堆栈跟踪中可见.任务完成.

跟踪中未显示方法调用,因为JIT优化器内联了该方法:这是隐藏堆栈跟踪中方法的唯一方法.

它不是你能控制好的东西,方法必须是'小'而不是抛出任何异常本身.否则通常认为这是一个问题,而不是一个功能.很难弄清楚如何编码从A到B.


vc *_* 74 5

您可以使用DebuggerHiddenAttribute

  • 这可以防止调试器破坏该成员中捕获的异常,但这是否会影响堆栈跟踪? (5认同)