Не перехватывается исключение, выданное задачей TaskEx.Run

У меня проблемы с асинхронной CTP, пытающейся выяснить, как правильно обрабатывать исключения. Приведенный ниже код дает сбой моей программе, когда, насколько я могу судить, await должно перехватывать и отбрасывать исключение в контексте, из которого оно вызывается, поэтому Not caught! Блок должен поймать исключение.

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

Спасибо за любую помощь или предложения.

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()

Что делает тот же код на вашем компьютере?

Совет для профессионалов: Visual Studio сообщает, что исключение не обработано, но если вы нажмете F5, вы увидите, что оно все- таки получилось.

(Это из комментариев к ответу Джона, но я думаю, что это заслуживает своего собственного ответа)

Немного перестановка должна работать:

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

РЕДАКТИРОВАТЬ:

Я получаю те же результаты, что и Джон Скит, потому что я также использую бета-версию VS11. Я не могу говорить за ОСАГО.

Другие вопросы по тегам