【问题标题】:Handle exception + await处理异常 + 等待
【发布时间】:2014-06-30 13:26:37
【问题描述】:

我有以下代码:

try
{
     await Task.Run(() => myAppClient.CreateResourceRecord());
}
catch (MyApplicationException dnsException)
{
   // Exception code
}

MyApplicationExceptionmyAppClient.CreateResourceRecord() 期间被抛出,但未在 catch (MyApplicationException dnsException) 语句中捕获。 怎么解决?

【问题讨论】:

  • 我不相信这个函数真的会抛出这个异常。可能,你误解了你所看到的。发布 CreateResourceRecord。
  • @usr - 我无法发布代码。我在调试器中检查了 MyApplicationException 被抛出
  • 然后创建一个 repro (throw new MyApplicationException();)。您会发现您无法创建复制品,因为您的解释是错误的。
  • 看看msdn.microsoft.com/en-us/library/dd537614(v=vs.110).aspx ...任务将异常包装在AggregateException中
  • @MarkoDevcic 和 await 解开它。

标签: c# exception async-await


【解决方案1】:

基于@usr 的cmets:

通过运行这个小而完整的控制台应用程序示例可以看出,异常确实被捕获了。

class Program
{
    static void Main(string[] args)
    {
        var t = foo();
        t.Wait();
        Console.ReadKey();
    }

    class MyApplicationException : Exception { }

    static async Task foo()
    {
        try
        {
            await Task.Run(() => { throw new MyApplicationException(); });
            Console.WriteLine("Completed without exception");
        }
        catch (MyApplicationException)
        {
            Console.WriteLine("Exception caught");
        }
    }
}

输出:

捕捉到异常

见:http://dotnetpad.net/ViewPaste/dJQgaYiqtEqqGTCiZJjdgw

【讨论】:

  • 鉴于问题中的信息,这基本上是可以给出的最佳答案。
【解决方案2】:

请记住,Task 在另一个线程中工作,因此也会在另一个线程中引发异常。要从 Task 捕获异常,请尝试以下操作:

try
{
    await Task.Run(() => myAppClient.CreateResourceRecord());
}
catch (AggregateException ae)
{
    ae.Handle((x) =>
    {
        if (x is MyApplicationException)
        {
            // Exception code
        }
    });
}

【讨论】:

  • 当你 await 一个任务时,它的异常是重新抛出等待它的线程。它还解开聚合异常并重新抛出其中的第一个异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2016-11-07
  • 1970-01-01
  • 2021-11-01
  • 2021-09-28
  • 1970-01-01
相关资源
最近更新 更多