gpt4 book ai didi

c# - 任务中重新抛出异常 (TPL) 丢失堆栈跟踪

转载 作者:太空狗 更新时间:2023-10-30 01:25:10 24 4
gpt4 key购买 nike

我有重新抛出异常的代码。

当我稍后从 task.Exception 读取异常时,它的堆栈跟踪指向我重新抛出异常的位置(如我所料,第 n 行而不是第 m 行)。

为什么会这样? TPL 中的错误或更可能是我忽略的问题。

作为解决方法,我可以将异常包装为新异常中的内部异常。

internal class Program
{
private static void Main(string[] args)
{
Task.Factory.StartNew(TaskMethod).ContinueWith(t => Console.WriteLine(t.Exception.InnerException));
Console.Read();
}

private static void TaskMethod()
{
try
{
line m: throw new Exception("Todo");
}
catch (Exception)
{
line n: throw;
}
}
}

最佳答案

不幸的是,由于 TPL 在任务完成执行之前存储异常的方式,原始堆栈跟踪丢失了。在 LINQPad 中运行您的示例代码显示异常是在 at System.Threading.Tasks.Task.Execute() 处抛出的,这显然是不正确的。

作为一种粗略的解决方法,您可以将原始堆栈跟踪(它是一个简单的字符串)存储在原始异常的 Data 属性中,然后您将然后可以访问它:

private static void TaskMethod()
{
try
{
throw new Exception("Todo");
}
catch (Exception ex)
{
ex.Data["OriginalStackTrace"] = ex.StackTrace;
throw;
}
}

然后您会将原始堆栈跟踪存储在 Data 字典的 OriginalStackTrace 值中:

这不是你真正想要的,但我希望它能有所帮助。

关于c# - 任务中重新抛出异常 (TPL) 丢失堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7570328/

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