是否可以生成排除内部方法的 .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
有时,当 .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