是否有任何建议将错误消息从数据访问层显示到视图?
Is there any recommendation to bring up error messages from Data Access Layer to the view?
我想知道从数据访问层(或其他层)向视图显示错误消息的最佳实践或最佳/优雅方式是什么。
我正在使用 ASP.NET MVC 5,我的项目有多个层,例如:
- MyApp.Web
- MyApp.Business
- MyApp.Repository
- MyApp.DAL
我有两种 "error messages" 想要提交给 IHM:
异常生成的错误:记录异常并显示人性化的错误消息。
业务错误:比如一个动作需要客户至少有3张发票,而他只有2张。
在另一个项目中,这是我所做的:
控制器
[HttpPost]
public ActionResult Edit()
{
//...
ErrorModel errorModel = new ErrorModel();
BusinessLayer businessLayer = new businessLayer()
businessLayer.Edit( /* some parameters */, out errorModel)
TempData[Error] = errorModel
}
查看
@{
var errorModel = TempData[Error]
}
/* if error model is not null, display the error correctly */
在每一层,我所有的方法都有一个out ErrorModel
变量,填充在try / catch
块中,或者因为业务失败,我绝对不喜欢这样。
我在 Google 或 Stack Overflow 上找到了很多答案,但都集中在如何捕获错误上。
*我的问题更进一步:一旦发现错误,如何以优雅的方式将错误从发生的层带到视图中?
一般方法是在所有层抛出异常并在顶层处理它们(表示 - 控制器操作)。异常是一种方法结果,不需要在方法签名中指定。传递 errorModel 的方法并不好,因为每个方法都应该 return 它并且每个方法都应该有 try catch 块。
在业务层中,您可以有一些从异常 class 派生的业务异常,并有一些额外的信息。或者您可以使用一般的 ApplicationException class.
所以,你的控制器可以看起来像
[HttpPost]
public ActionResult Edit()
{
try
{
businessLayer.Edit( /* some parameters */)
return Ok();
}
catch(BadAcctionException)
{
TempData[Error] = "Bad business operation";
return BadBusinessAction();
}
catch(ApplicationException ex)
{
TempData[Error] = ex.Message;
return Fail();
}
}
在 businessLayer.Edit 中,如果出现错误,您将抛出异常。
我想知道从数据访问层(或其他层)向视图显示错误消息的最佳实践或最佳/优雅方式是什么。
我正在使用 ASP.NET MVC 5,我的项目有多个层,例如:
- MyApp.Web
- MyApp.Business
- MyApp.Repository
- MyApp.DAL
我有两种 "error messages" 想要提交给 IHM:
异常生成的错误:记录异常并显示人性化的错误消息。
业务错误:比如一个动作需要客户至少有3张发票,而他只有2张。
在另一个项目中,这是我所做的:
控制器
[HttpPost]
public ActionResult Edit()
{
//...
ErrorModel errorModel = new ErrorModel();
BusinessLayer businessLayer = new businessLayer()
businessLayer.Edit( /* some parameters */, out errorModel)
TempData[Error] = errorModel
}
查看
@{
var errorModel = TempData[Error]
}
/* if error model is not null, display the error correctly */
在每一层,我所有的方法都有一个out ErrorModel
变量,填充在try / catch
块中,或者因为业务失败,我绝对不喜欢这样。
我在 Google 或 Stack Overflow 上找到了很多答案,但都集中在如何捕获错误上。
*我的问题更进一步:一旦发现错误,如何以优雅的方式将错误从发生的层带到视图中?
一般方法是在所有层抛出异常并在顶层处理它们(表示 - 控制器操作)。异常是一种方法结果,不需要在方法签名中指定。传递 errorModel 的方法并不好,因为每个方法都应该 return 它并且每个方法都应该有 try catch 块。
在业务层中,您可以有一些从异常 class 派生的业务异常,并有一些额外的信息。或者您可以使用一般的 ApplicationException class.
所以,你的控制器可以看起来像
[HttpPost]
public ActionResult Edit()
{
try
{
businessLayer.Edit( /* some parameters */)
return Ok();
}
catch(BadAcctionException)
{
TempData[Error] = "Bad business operation";
return BadBusinessAction();
}
catch(ApplicationException ex)
{
TempData[Error] = ex.Message;
return Fail();
}
}
在 businessLayer.Edit 中,如果出现错误,您将抛出异常。