C#堆栈跟踪采用以下形式:
at Foo.Core.Test.FinalMethod(Doh doh) in C:\Projects\src\Core.Tests\Test.cs:line 21
at Foo.Core.Test.AnotherMethod(Bar bar)
at Foo.Core.Test.AMethod() in C:\Projects\src\Core.Tests\Test.cs:line 6
at Foo.Core.Test.<>c__DisplayClass7.<SomeAnonDelegate>b__6(Object _) in C:\Projects\src\Core.Tests\Test.cs:line 35
如何从每一行检索命名空间,类,方法,文件和行号?
会欣赏一些想法和意见。
答案 0 :(得分:13)
如果您是从StackTrace获得此内容,则可以通过StackFrames循环浏览GetFrame并致电GetMethod,GetFileName和{ {3}}。可以从方法中检索命名空间和类。
修改强>
在回复第一条评论时(不幸的是,我们从Exception.StackTrace 获取了跟踪),您可以调用GetFileLineNumber构造函数。
修改强>
我应该链接到这个构造函数 - StackTrace(Exception)。
答案 1 :(得分:3)
我读了Austin Salonen的回答,这显然更好,但我已经开始使用正则表达式。所以无论如何我都会写它。
Regex r = new Regex(@"at (?<namespace>.*)\.(?<class>.*)\.(?<method>.*(.*)) in (?<file>.*):line (?<line>\d*)");
var result = r.Match(@"at Foo.Core.Test.FinalMethod(Doh doh) in C:\Projects\src\Core.Tests\Test.cs:line 21");
if (result.Success)
{
string _namespace = result.Groups["namespace"].Value.ToString();
string _class = result.Groups["class"].Value.ToString();
string _method = result.Groups["method"].Value.ToString();
string _file = result.Groups["file"].Value.ToString();
string _line = result.Groups["line"].Value.ToString();
Console.WriteLine("namespace: " + _namespace);
Console.WriteLine("class: " + _class);
Console.WriteLine("method: " + _method);
Console.WriteLine("file: " + _file);
Console.WriteLine("line: " + _line);
}
答案 2 :(得分:1)
StackTraceParser 可以将堆栈跟踪文本输出(例如,通常由Environment.StackTrace或Exception.StackTrace返回)解析回一系列堆栈跟踪帧,包括以下组件: / p>
Type
Method
Parameter types and names
File and line information, if present
它以NuGet source package的形式提供,直接嵌入到C#项目中。
然而,它需要指定一些功能,并且它的使用并不是立即显而易见的。
public static IEnumerable<TFrame> Parse<TToken, TMethod, TParameters, TParameter, TSourceLocation, TFrame>(
string text,
Func<int, int, string, TToken> tokenSelector,
Func<TToken, TToken, TMethod> methodSelector,
Func<TToken, TToken, TParameter> parameterSelector,
Func<TToken, IEnumerable<TParameter>, TParameters> parametersSelector,
Func<TToken, TToken, TSourceLocation> sourceLocationSelector,
Func<TToken, TMethod, TParameters, TSourceLocation, TFrame> selector)
请参阅https://github.com/atifaziz/StackTraceParser和https://bitbucket.org/project-elmah/main/src/2a6b0b5916a6b4913ca5af4c22c4e4fc69f1260d/src/Elmah.AspNet/ErrorDetailPage.cs?at=default&fileviewer=file-view-default
中的示例