没有捕获TaskEx.Run任务抛出的异常

时间:2012-05-29 18:27:34

标签: c# async-ctp

我遇到了异步CTP的问题,试图弄清楚处理异常的正确方法是什么。下面的代码崩溃了我的程序,据我所知,await应该捕获并在调用它的上下文中重新抛出异常,因此Not caught!块应该捕获异常。 / p>

try {
  await TaskEx.Run(() => {
    throw new Exception();
  });
} catch {
  // Not caught!
}

感谢您提供任何帮助或建议。

3 个答案:

答案 0 :(得分:3)

使用测试版(而不是CTP,因此TaskEx成为Task)对我来说很好用:

using System;
using System.Threading.Tasks;

class Test
{
    static void Main()
    {
        Task t = Foo();
        t.Wait();
    }

    static async Task Foo()
    {
        try
        {
            await Task.Run(() => { throw new Exception(); });
        }
        catch (Exception e)
        {
            Console.WriteLine("Bang! " + e);
        }
    }

输出:

Bang! System.Exception: Exception of type 'System.Exception' was thrown.
   at Test.<Foo>b__0()
   at System.Threading.Tasks.Task`1.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter
            .HandleNonSuccessAndDebuggerNotification(Task task)
   at Test.<Foo>d__2.MoveNext()

相同的代码在您的计算机上执行了什么操作?

答案 1 :(得分:1)

专业提示:Visual Studio 告诉您异常未处理,但如果您通过F5,您将看到 被捕获。

(这是关于Jon的答案的评论,但我认为它应该得到答案)

答案 2 :(得分:0)

一些重新安排应该有效:

  await TaskEx.Run(() => {
    try {
      throw new Exception();
    } catch {
      // Caught!
    }
  });

修改

我得到与Jon Skeet相同的结果,因为我还在运行VS11测试版。我不能代表CTP发言。