Controller中的操作没有捕获异常

时间:2017-07-28 15:46:33

标签: c# mysql asp.net-mvc-5.2 .net-4.7

我希望有人可以解释发生的事情。

我创建了一个存储库类“InvoicesRepository.cs”,它管理列出,插入,更新,删除等“Invoice.cs”对象的所有逻辑。更清洁,更易于维护。

public class InvoicesRepository
{
    protected MySQLContext db;

    public InvoicesRepository(MySQLContext db)
    {
        this.db = db;
    }

    public async void Insert(Invoice obj)
    {
        this.db.Invoices.Add(obj);
        await this.db.SaveChangesAsync();

        // performing other tasks...
    }

    // other useful methods...
}

有一个“InvoicesController.cs”,包含我需要的所有操作。在这个控制器里面我创建一个“InvoiceTepository”obj,然后用它来保存信息到数据库。而且,在每一个行动中

public class InvoicesController : Controller
{
    private InvoicesRepository invoices;

    public InvoicesController()
    {
        this.invoices = new InvoicesRepository(new MySQLContext());
    }

    [HttpPost]
    public async Task<ActionResult> Upload(Invoice invoice)
    {
        try
        {
            this.invoices.Insert(invoice);
        }
        catch (DbEntityValidationException ex)
        {
            foreach (var eve in ex.EntityValidationErrors)
            {
                foreach (var err in eve.ValidationErrors)
                {
                    ModelState.AddModelError(err.PropertyName, err.ErrorMessage);
                }
            }
        }
        catch (System.Data.Entity.Infrastructure.DbUpdateException ex)
        {
            ModelState.AddModelError("", ex.ToString());
        }
        catch (System.Data.Entity.Core.UpdateException ex)
        {
            ModelState.AddModelError("", ex.ToString());
        }
        catch (MySql.Data.MySqlClient.MySqlException ex)
        {
            ModelState.AddModelError("", ex.ToString());
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.ToString());
        }

        return View();
    }

    // other useful action methods...
}

为了进行测试,我正在插入一个“Invoice”对象,该对象在数据库中有一个重复数据(唯一列),期望抛出异常然后我的动作捕获它并在视图中正确显示错误但是...例外情况是“抛出”但不是“被捕获”。

我进行了调试以查看抛出了什么类型的异常(包括它们的内部异常)并添加了所需的“捕获”但仍然没有“捕获”异常。

如果我更改控制器的代码以直接使用“MySQLContext.cs”类来保存信息,则异常被“捕获”:

    [HttpPost]
    public async Task<ActionResult> Upload(Invoice invoice)
    {
        try
        {
            // this is "catched" ¿?
            this.db.Invoices.Add(obj);
            await this.db.SaveChangesAsync();
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.ToString());
        }

        return View();
    }

为什么会这样?我需要能够捕获我的“插入”或“InvoiceRepository”类中的任何其他函数抛出控制器内的任何异常。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

您不是await Insert方法,因此您的行为无法捕获任何异常。 Visual Studio应该给你一个警告信息,表明在该方法中没有等待任何东西。将您的代码更改为:

await this.invoices.Insert(invoice);

此外,您的存储库不应使用async void,它应返回Task