Controller 中的操作未捕获异常

Action in Controller is not catching an exception

我希望有人能解释发生了什么。

我创建了一个存储库 class "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" 对象,然后用它来将信息保存到数据库中。并且,在每个动作中

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" 对象,希望抛出异常,然后我的操作捕获它并在视图中正确显示错误但是...例外是 "thrown" 但不是 "catched".

我调试以查看抛出的异常类型(包括它们的内部异常)并添加了所需的 "catches" 但异常仍然不是 "catched".

如果我更改控制器代码以直接使用 "MySQLContext.cs" class 来保存信息,例外情况是 "catched":

    [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();
    }

为什么会这样?我需要能够捕获我的 "Insert" 或 "InvoiceRepository" class 中的任何其他函数在控制器内抛出的任何异常。

如有任何帮助,我们将不胜感激。

您没有await使用Insert 方法,因此您的操作不可能捕获任何异常。 Visual Studio 应该给您一条警告消息,说明该方法中没有等待任何内容。将您的代码更改为:

await this.invoices.Insert(invoice);

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