gpt4 book ai didi

c# - 等待 .NET 4.0 : meaningful stack traces

转载 作者:IT王子 更新时间:2023-10-29 04:25:09 24 4
gpt4 key购买 nike

我有一个使用 .NET 4.0 的 C# 控制台应用程序项目,安装了 Microsoft.Bcl.Async 包。我使用这段代码:

internal class Program
{
private static void Main(string[] args)
{
Foo().Wait();
}

static void Log(Exception ex)
{

}

private static async Task Foo()
{
try
{
await DoSomething();
}
catch (Exception ex)
{
Log(ex);
}
}

private static async Task DoSomething()
{
throw new DivideByZeroException();
}
}

如果我在 Log 方法中放置一个断点,我会得到 DivideByZero 异常,但我看到的堆栈跟踪是:

at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task)
at Microsoft.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at Microsoft.Runtime.CompilerServices.TaskAwaiter.GetResult()
at AsyncStacks.Program.<Foo>d__0.MoveNext() in p:\Sandbox\AsyncStacks\AsyncStacks\Program.cs:line 25

这个堆栈跟踪几乎没有用,因为它没有告诉我异常实际抛出的位置。

如果我将我的项目更改为以 .NET 4.5 为目标,我会得到一个更有用的异常:

at AsyncStacks.Program.<DoSomething>d__3.MoveNext() in p:\Sandbox\AsyncStacks\AsyncStacks\Program.cs:line 35
--- 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 AsyncStacks.Program.<Foo>d__0.MoveNext() in p:\Sandbox\AsyncStacks\AsyncStacks\Program.cs:line 25

如何在使用 await 时从 .NET 4.0 项目中获取有用的堆栈跟踪?

更新

“老”AsyncTargetingPack确实抛出了更好的堆栈跟踪。该问题似乎已在"new"中引入Microsoft.Bcl.Async .

最佳答案

Foo 更改为此似乎可以获得更好的结果:

private static async Task Foo()
{
await DoSomething().ContinueWith(t => Log(t.Exception), TaskContinuationOptions.OnlyOnFaulted);
}

更新:但是,缺点是每次使用 await 关键字时都必须使用相同的 .ContinueWith。即,如果您等待的东西也在等待,您也需要 .ContinueWith

关于c# - 等待 .NET 4.0 : meaningful stack traces,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17921659/

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