gpt4 book ai didi

c# - 被Exception.StackTrace的内容搞糊涂了

转载 作者:太空狗 更新时间:2023-10-29 18:33:04 24 4
gpt4 key购买 nike

假设我有以下情况:

9     class Program
10 {
11 public static void WrapperMethod(Action func)
12 {
13 try
14 {
15 //throw new Exception("Case 1");
16 func.Invoke();
17 }
18 catch (Exception ex)
19 {
20 Console.WriteLine(ex.StackTrace);
21 }
22 }
23
24 static void Main(string[] args)
25 {
26 WrapperMethod(() => { throw new Exception("Case 2"); });
27 }
28 }

我运行它并得到以下输出:

at TestExceptions.Program.<Main>b__0() in c:\users\administrator\documents\visual studio 2010\Projects\TestExceptions\TestExceptions\Program.cs:line 26    
at TestExceptions.Program.WrapperMethod(Action func) in c:\users\administrator\documents\visual studio 2010\Projects\TestExceptions\TestExceptions\Program.cs:line 16

如果我取消注释 throw new Exception("Case 1");输出是:

at TestExceptions.Program.WrapperMethod(Action func) in c:\users\administrator\documents\visual studio 2010\Projects\TestExceptions\TestExceptions\Program.cs:line 15

所以我的问题是,为什么在第一种情况下我可以看到包括 Main 函数在内的完整路径,而在第二种情况下我却看不到相同的内容。如果生产代码类似于第二种情况,如何显示更完整的信息。

最佳答案

您在堆栈跟踪中看到的是编译器为您传递给 WrapperMethod 的匿名函数生成的名称。在这种情况下,除非不使用匿名函数,否则无法获得“更漂亮的名称”。

但是,当您知道这一点时,“在头脑中解析”损坏的堆栈跟踪应该不难。您可以通过名称识别匿名函数,类似于 <Main>b__0() , 你可以看出它是在 Program 中声明的类,因为这是编译器决定生成函数的地方。

您不会丢失任何堆栈信息。如果在 WrapperFunction 内部抛出异常,那将是最顶层的堆栈框架。如果在 WrapperFunction 调用的方法内抛出异常,则该方法(在本例中为匿名)将位于堆栈顶部。

关于c# - 被Exception.StackTrace的内容搞糊涂了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5342850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com