对我来说似乎是这样的,因为几乎所有向控制器发出的路由请求的下游抛出的异常都会抛入控制器或控制器的下游。控制器除了视图之外没有任何上游,这仅仅是控制器中发生的情况的呈现。MVC控制器层是错误处理的理想场所吗?
回答
控制器操作是大多数错误处理的理想场所,但不是全部。
直到控制器操作完成执行后才会呈现视图。因此,例如,如果将视图传递给不仅仅是简单数据容器的视图模型,而且在呈现视图时引发异常(并非罕见情况)。在控制器操作中你无法理解这一点。
这里是一个工具,你可以用它来捕捉控制器 http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx
已经从开始就使用Elmah :-) – ProfK 2010-08-03 13:06:45
它通常通过查看你需要显示在较低的水平如出现这样的错误控制器确定外例外BLL/DAL,仍然可以进行错误处理并且可以由控制器辅助,例如,
public ActionResult DisplayObject(int id)
{
// high level error handling
using (MyRepo repo = new MyRepo())
{
var obj = repo.GetObj(id);
if (obj == null)
return View("ErrorDisplayingObject");
else
return View("ObjectDetails");
}
}
...
public ActionResult SaveObject(int id, string param1, string param2)
{
// high level error handling
using (MyRepo repo = new MyRepo())
{
var obj = repo.GetObj(id);
if (obj != null)
{
obj1.Param1 = param1;
obj2.Param2 = param2;
if (repo.Save())
return View("SaveConfirmation");
}
}
return View("ErrorSavingObject");
}
...
public class MyRepo
{
public MyObject GetObj(int id)
{
// low level error handling
try
{
// retrieve object
}
catch (Exception)
{
return null;
}
}
public bool Save()
{
// low level error handling
try
{
// save data
return true;
}
catch (Exception)
{
return false;
}
}
}
模型必须是您可以进行验证的最合适的地方。理想情况下,模型必须是域模型应该放置的地方。因此,这使得它成为错误验证的理想场所。
为模型欢呼。控制者应该是精益和平均的。模型应该很胖。实际上,我将验证和数据访问分解为服务和存储库层。但是 - 这是模型验证的良好开端,http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx – gnome 2010-08-03 14:04:14
它取决于异常和您的操作。例如,如果您保存的实体可能会破坏某些业务规则,那么预计您的BLL会抛出一个异常(例如BusinessRuleXXException)来表示这种不合规情况。在这种情况下,您必须处理该异常(控制器是做这件事的好地方),并向用户显示一条适当的消息,指出 出了什么问题(由于bla bla ...,您不能保存这个消息)。
在另一方面,你可能在至极 you're执行某些动作的越野车应用程序,你挑起的错误,例如像被违反了PK约束或许外部 服务不可用或任何其他情形那些预计不会在您的应用程序中代表真正的例外。对于这种类型的错误,我的建议是通过使用HandleError过滤器或自定义过滤器来处理全局错误,并处理错误 并记录它们,并将用户重定向到错误页面,其中有一个友好的“对不起,出错了。已经派出一支训练有素的猴子来处理这种情况,“信息显示。
问候。
- 1. 的WebAPI控制器错误处理
- 2. 控制器上的错误处理
- 3. KeyUp处理错误控制
- 4. 404错误的图像处理asp.net mvc控制器行动
- 5. 使用MVC控制器中的错误处理
- 6. ASP MVC - 获取控制器级别的错误处理
- 7. 处理Spring MVC控制器的异常
- 8. 如何在ASP.NET MVC 3控制器中执行错误处理?
- 9. 全局错误在ASP.NET处理(控制器外)MVC
- 10. iAd Banner的理想场所
- 11. 错误处理的Spring MVC Rest服务控制器是否正确?
- 12. 在MVC控制器中处理EF DBContext
- 13. Spring-mvc控制器和异常处理
- 14. asp.net的MVC错误处理
- 15. N层/ N层错误处理设计
- 16. Spring MVC,如何让控制器处理程序处理映射处理程序之前的所有请求?
- 17. ASP.NET MVC 5错误处理
- 18. Spring MVC中处理错误
- 19. 在MVC中处理错误
- 20. MVC区域错误处理
- 21. PHP MVC MySQL错误处理
- 22. ASP.NET MVC Ajax错误处理
- 23. MVC 3-错误处理
- 24. spring java mvc错误处理
- 25. ASP .Net用户控制错误处理
- 26. 控制器是否处理与MVC中模型的所有交互?
- 27. 如何在JqGrid内联编辑中处理来自MVC控制器的错误
- 28. 如何处理RESTful Spring MVC控制器中的验证错误和异常?
- 29. 处理所有错误
- 30. 如何使Ember控制器处理服务器验证错误?
但是如果视图中有一些错误呢? – 2010-08-03 11:44:38
@ajay - 那么你做错了。你不应该在只显示数据的东西上遇到HTTP 500。所有逻辑,数据连接,模型绑定等应该在控制器/模型中发生,而不是在视图中。 – Tommy 2010-08-03 11:52:18
@Tommy不是真的,这个视图当然只是显示数据,但是它可以访问模型,通常这不仅仅是一个简单的数据容器,因此可能会导致抛出异常。所以不要假设你的视图不会抛出异常。 – Mendelt 2010-08-03 12:05:50