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

标签 c# .net 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)
        {

        }
    }
}

这会抛出堆栈跟踪:

at Spork.Program.ThrowMe() in C:\Projects\XXX\Testing Sandbox\ConsoleTesting\Program.cs:line 58

at Spork.Program.HideMe() in C:\Projects\XXX\Testing Sandbox\ConsoleTesting\Program.cs:line 64

at Spork.Program.Main(String[] args) in C:\Projects\XXX\Testing Sandbox\ConsoleTesting\Program.cs:line 70

最佳答案

将 Console.WriteLine(e) 放在 catch block 中。切换到发布版本并按 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 

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

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

这不是您可以很好地控制的东西,该方法必须“小”并且本身不会抛出任何异常。这通常被认为是一个问题,而不是一个功能。很难弄清楚代码是如何从 A 到 B 的。

关于c# - 我如何告诉编译器忽略堆栈跟踪中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4818745/

相关文章:

java - SONAR 扩展异常还是运行时异常?

c# - 将字符串转换为动态对象

c# - 错误 CS0019 运算符 '==' 无法应用于类型 'HttpStatusCode' 和 'int' 的操作数

.net - 如何使用 roslyn 检测 Visual Studio 2015 扩展中的符号重命名?

c# - 在 Windows 7 上调用 IPrincipal.IsInRole

java - 在握手过程中从 SSLEngine Wrap 方法获取 SSLException

c# - 如何实现自动调整大小的文本以适合文本框的可见部分?

c# - 如何分解 try/catch 代码?

.net - 我应该如何修复/解决异常未找到框架 ".NETFramework,Version=v4.6.1"的引用程序集?

java - finally block 的意义