【发布时间】:2015-09-30 19:30:02
【问题描述】:
我正在尝试在下面的示例中获取异常堆栈跟踪的最内部方法名称。由于未知原因,我总是得到MoveNext 方法名称,而不是真实名称。我该如何解决?
var st = new StackTrace(ex, true);
var frame = st.GetFrames()?.First(y => y.GetFileName() != null);
var method = frame.GetMethod().ToString(); // result: Void MoveNext()
var method2 = frame.Name; // result: MoveNext
更新:
当TPL Dataflow Block 的委托中抛出异常时会发生这种情况:
private async Task Parse(ListItem item)
{
await Task.Delay(1);
throw new Exception("Error");
}
//...
var parseBlock = new ActionBlock<ListItem>(
async x => { await Parse(x).ConfigureAwait(false); });
我从任何代表的任何区块中获得MoveNext。堆栈跟踪:
at RP.Core.ListsPipeline.<Parse>d__21.MoveNext() in Class.cs:line 179
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
at Class.<<Start>b__18_0>d.MoveNext() in Class.cs:line 81
我想获取Parse 方法名(StackTrace 的第一个字符串)。
【问题讨论】:
-
向我们展示触发异常的代码。
-
贴出的代码是“如何获取异常信息”,没有必要。
-
还发布确切的异常详细信息(来自调试器窗口)。
-
你已经得到了名字,至少是 async/await 转换给你留下的名字。您的方法已成为“状态机”(一个类),而 MoveNext() 是它的主要方法。
-
当然有,用一些简单的正则表达式。
标签: c# exception methods async-await task-parallel-library