MVC处理来自子异步方法的异常

时间:2014-10-07 23:14:32

标签: asp.net-mvc exception-handling async-await

如何处理MVC中子动作的线程中的异常?

在此示例中,MakePayment方法的异常不由调用操作的catch处理:

控制器中的动作:

public async Task<ActionResult> Payment()
{

    try
    {
        var tokenId = "12345";
        var order = new OrderViewModel
                    {
                        Amount = 10.00,
                        Description = "Widget",
                        Customer = 1                         
                     };

        var payment = new PaymentService();
        var model = await payment.MakeCharge(tokenId, order);

    } 
    catch(Exception ex)
    {
        ViewBag.Message = ex.Message.toString();
        return view("Failed");
    }

    return View(model);
}

付款类:

public class PaymentService
{
  public async Task<Charge> MakeCharge(string tokenId, OrderViewModel order)
  {
     return await Task.Run(() =>
     {
       var myCharge = new ChargeCreateOptions
       { 
          Amount = order.Amount,
          Description = order.Description,
          TokenId = tokenId
       };

       var chargeService = new ChargeService();
       var charge = chargeService.create(mycharge);    

       return charge;       

     });
  }
}

感谢您提供任何指导。

1 个答案:

答案 0 :(得分:1)

我知道这是一个古老的问题,但我暂时没有像评论中所说的那样支持。

除了那个无聊的回答,我建议您阅读本文https://msdn.microsoft.com/hu-hu/magazine/dn683793(en-us).aspx,了解c#6中的try / catch异步方法中的新闻。

现在我认为没有理由在您的示例中使用Task.Run()。当你应该使用Task.Run()时,一个明显的例子就是当你不想在进行同步的CPU繁重工作时阻止你的UI线程。在您的情况下,您没有任何UI线程。