我希望有人可以解释发生的事情。
我创建了一个存储库类“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”类中的任何其他函数抛出控制器内的任何异常。
任何帮助都将不胜感激。
答案 0 :(得分:2)
您不是await
Insert
方法,因此您的行为无法捕获任何异常。 Visual Studio应该给你一个警告信息,表明在该方法中没有等待任何东西。将您的代码更改为:
await this.invoices.Insert(invoice);
此外,您的存储库不应使用async void
,它应返回Task