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
我希望有人能解释发生了什么。
我创建了一个存储库 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