Не перехватывается исключение, выданное задачей 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. Я не могу говорить за ОСАГО.