我希望有人能解释一下正在发生的事情。
我创建了一个存储库类"InvoicesRepository.cs",用于管理列出,插入,更新,删除等"发票.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...
}
有一个"发票控制器.cs",其中包含我需要的所有操作。在这个控制器中,我创建了一个"发票"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...
}
为了进行测试,我正在插入一个"发票"对象,该对象在数据库中具有重复数据(唯一列(,期望引发异常,然后我的操作捕获它并在视图中正确显示错误,但是...例外是"抛出"但不"捕获"。
我调试以查看抛出的异常类型(包括其内部异常(并添加了所需的"捕获",但异常仍未"捕获"。
如果我更改控制器的代码以直接使用"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"类中的任何其他函数在控制器内抛出的任何异常。
任何帮助将不胜感激。
您没有await
Insert
方法,因此您的操作无法捕获任何异常。Visual Studio应该给你一个警告消息,指出该方法没有等待任何东西。将您的代码更改为以下内容:
await this.invoices.Insert(invoice);
另外,您的仓库不应该使用async void
,它应该返回一个Task