【问题标题】:Stack trace not providing exception source method when using async in Silverlight 5在 Silverlight 5 中使用异步时堆栈跟踪不提供异常源方法
【发布时间】:2014-12-02 14:42:45
【问题描述】:

我在 VS2013 中创建了一个新的 Silverlight 5 项目并添加了 Microsoft Async (1.0.168) NuGet 包。然后我创建一个简单的异步事件处理程序,如下所示:

private async void OnButtonClick(object sender, RoutedEventArgs e)
{
    await AsyncMethod();
}

private static async Task AsyncMethod()
{
    await TaskEx.Run(() => { });
    NormalMethod();
}

private static void NormalMethod()
{
    throw new Exception("test exception");
}

当我单击按钮时,出现以下异常:

{System.Exception: test exception
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 SilverlightApplication1.MainPage.<OnButtonClick>d__0.MoveNext()}

我想要用于调试目的的关键信息是异常的源方法(即 NormalMethod)。

我已经查看了一些相关问题(链接如下),并认为我了解异步对堆栈跟踪的影响,但我不明白为什么框架不会以保持了解的方式抛出异常源方法。有关如何简单地获取此信息的任何想法/建议?

相关问题:
Missing exception stack trace informations when using Async Targeting Pack in Silverlight 5.0
Is it possible to get a good stack trace with .NET async methods?

【问题讨论】:

    标签: c# .net async-await silverlight-5.0 stack-trace


    【解决方案1】:

    试试我的这个要点:

    https://gist.github.com/aelij/7d37fa3657921cbd9d3d

    上述代码与官方Microsoft.Bcl.Async实现的区别在于方法PrepareExceptionForRethrow。 Silverlight 没有ExceptionDispatchInfo,因此原始实现重新抛出异常,从而丢失了原始堆栈跟踪信息。此代码尝试通过搜索合适的构造函数将异常包装为相同类型的内部异常。

    【讨论】:

    • 感谢您的回复@Eli。回复较晚,抱歉。我放弃了在我正在从事的项目中使用异步。我刚刚在我的问题中概述的简单场景中尝试了您的要点,它现在确实在异常详细信息中提供了源方法的详细信息。尽管如此,我还没有进行任何进一步的测试。
    猜你喜欢
    • 2011-01-05
    • 2017-08-06
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多