Task
поймает исключения для вас. Если вы позвоните task.Wait()
, он перехватит все пойманные исключения в AggregateException
и выдаст его.
[HandleError]
public void FooAsync()
{
AsyncManager.OutstandingOperations.Increment();
AsyncManager.Parameters["task"] = Task.Factory.StartNew(() =>
{
try
{
DoSomething();
}
// no "catch" block. "Task" takes care of this for us.
finally
{
AsyncManager.OutstandingOperations.Decrement();
}
});
}
public ActionResult FooCompleted(Task task)
{
// Exception will be re-thrown here...
task.Wait();
return View();
}
Простого добавления атрибута [HandleError]
недостаточно. Поскольку исключение возникает в другом потоке, мы должны вернуть исключение обратно в поток ASP.NET, чтобы что-то с ним сделать. Только после того, как мы выбросим исключение из правильного места, атрибут [HandleError]
сможет выполнить свою работу.