【问题标题】:How to prevent .Wait() from mangling the exception? [duplicate]如何防止 .Wait() 破坏异常? [复制]
【发布时间】:2015-02-10 13:41:20
【问题描述】:

我有以下代码:

private static void Main()
{
    AsyncMain().Wait();
}

private static async Task AsyncMain()
{
    throw new Exception("Panic!");
}

在这种情况下,异常最终将在 Wait() 处的调试器中显示为聚合异常。如何让它出现在抛出异常的地方?

【问题讨论】:

  • 转到工具 -> 异常 -> 公共语言运行时异常并勾选复选框

标签: c# async-await .net-4.5


【解决方案1】:

所有异步异常都被“捆绑”并作为AggregateException 抛出。您原来的异常只是AggregateException 的一个内部异常。您可以执行以下操作来处理它:

private static void Main()
{
    try
    {
        AsyncMain().Wait();
    }
    catch (AggregateException aggEx)
    {
        foreach (Exception ex in taskEx.InnerExceptions)
        {
            // Handle your original exception here.
        }
    }
}

AggregateException 被抛出Wait 的原因是因为异常只有在被观察到时才会被捕获!理解这一点很重要,因为如果您在上面的示例中没有使用Wait,则永远不会发生异常。

如果需要捕捉AsyncMain中的异常,则用try/catch包围,在方法中处理,否则在观察到的时间和地点总会抛出。

如果您有空闲时间,请阅读Sacha Barber's article series on TPL。绝对精彩。他很好地解释了这些概念!

【讨论】:

  • 我不想处理我的异常。我已经知道该怎么做。我正在寻找的是如何让异常在正确的行上的调试器中中断。
  • @Layl,请参阅 Yuval 对您的问题的评论
  • 道歉@Layl,请参阅修改后的答案。
  • 看来我正在查看的特定异常在 Visual Studio 中有一些奇怪的设置,导致奇怪的异常行为。现在已通过 Yuval 建议的“例外”菜单修复此问题
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2016-02-06
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多