是否可以生成排除内部方法的 .NET 堆栈跟踪?

Can a .NET stack trace be generated that excludes internal methods?

有时,当 .NET class 方法发生异常时,该方法本身在内部调用了一堆其他方法,但错误发生在其中一个方法中。这使得堆栈跟踪变得臃肿和凌乱,其中包含比需要更多的 "meaningless" 东西。有没有一种方法可以获取在导致错误的 public .NET 方法处停止的堆栈跟踪,而不是让它显示 .NET 方法的所有内部结构?

ADO.NET 的 ExecuteNonQuery() 就是一个例子。在内部,像 5-6 个函数这样的调用和异常可能直到第 6 个嵌套函数才会发生,因此堆栈跟踪显示了所有我们无法做任何事情或关心的内部结构。如果它在 ExecuteNonQuery() 处停止,那会更好更干净,因为那是 public 面向 .NET 的方法。

简短的回答是 "no",您无法更改 .NET 生成堆栈跟踪的方式。生成堆栈跟踪时,它会显示每个调用站点。但是,如果您想要一些自定义行为,您可以编写一些自定义代码来编辑您生成的堆栈跟踪的输出。

要生成堆栈跟踪,您可以使用如下代码:

StackTrace stackTrace = new StackTrace();           
StackFrame[] stackFrames = stackTrace.GetFrames();  

构造函数将生成堆栈跟踪数据,.GetFrames() 将return 方法提供给您。从那时起,您可以根据需要过滤它们(使用 stackFrame.GetMethod() 获取每个帧的方法信息 - 过滤它或将其添加到 StringBuilder 用于字符串输出等)

参考:https://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace(v=vs.110).aspx