我有重新抛出异常的代码。
当我后来从 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()
,这显然是不正确的。
作为一个粗略的解决方法,您could将原始堆栈跟踪(它是一个简单的字符串)存储在Data
原始异常的属性,然后您就可以访问它:
private static void TaskMethod()
{
try
{
throw new Exception("Todo");
}
catch (Exception ex)
{
ex.Data["OriginalStackTrace"] = ex.StackTrace;
throw;
}
}
然后你将把原始的堆栈跟踪存储在OriginalStackTrace
的值Data
字典:
这不是你真正想要的,但我希望它有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)