Как вы обрабатываете исключение с AsyncController ASP.net MVC? - PullRequest
7 голосов
/ 30 мая 2011

У меня есть это ...

    public void FooAsync()
    {
        AsyncManager.OutstandingOperations.Increment();

        Task.Factory.StartNew(() =>
        {
            try
            {
                doSomething.Start();
            }
            catch (Exception e)
            {
                AsyncManager.Parameters["exc"] = e;
            }
            finally
            {
                AsyncManager.OutstandingOperations.Decrement();
            }
        });
    }

    public ActionResult FooCompleted(Exception exc)
    {
        if (exc != null)
        {
            throw exc;
        }

        return View();
    }

Есть ли лучший способ передать исключение обратно в ASP.net?

Приветствия, Ян.

Ответы [ 2 ]

5 голосов
/ 29 октября 2011

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] сможет выполнить свою работу.

0 голосов
/ 18 октября 2011

Попробуйте добавить такой атрибут в действии FooAsync:

[HandleError (ExceptionType = typeof (MyExceptionType) View = "Exceptions/MyViewException")]

Таким образом, вы можете создать представление для отображения подробной ошибки пользователю.

...