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

问题描述:

有时,当.NET类方法发生异常时,该方法本身在内部调用一堆其他方法,但是其中一个方法发生错误。这使得堆栈跟踪臃肿和凌乱,比所需“更无意义”的东西。有没有办法得到一个堆栈跟踪停止在公共.NET方法导致的错误,并显示所有内部的.NET方法?是否可以生成一个排除内部方法的.NET堆栈跟踪?

一个例子是ADO.NET的ExecuteNonQuery()。内部调用像5-6个函数,并且直到第6个嵌套函数才会发生异常,所以堆栈跟踪显示了所有那些我们无法做或不关心的内部事件。如果它在ExecuteNonQuery()处停下来,它会更好,更干净,因为这是面向公众的.NET方法。

+1

是否有任何实际的原因?你可以抓到并重新抛出,但为什么? – Sinatr

+4

你确定内部方法名称是无意义的吗?例如。如果'ExecuteNonQuery'抛出'NullReferenceException',你从哪里开始看?对比如果内部方法名称包含“参数”一词,是否不能帮助您更快地放大应该查找的位置? –

+0

您可以创建一个自定义的异常类并过滤出您不希望堆栈跟踪的内容。 – PaulF

简短的回答是“否”,你不能改变.NET生成堆栈跟踪的方式。当生成堆栈跟踪时,它会显示每个呼叫站点。但是,如果您想要有一些自定义行为,则可以编写一些自定义代码来编辑您生成的堆栈跟踪的输出。

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

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

的构造将产生堆栈跟踪数据,并.GetFrames()将方法会返回给你。从这一点来说,你可以根据需要进行筛选(使用stackFrame.GetMethod()让每一帧的方法信息 - 无论是对其进行过滤,或将其添加到一个StringBuilder为你的字符串输出等)

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