ASP.NET MVC Controller.OnException未被调用

我有一个基本控制器类,我将覆盖Controller.OnException处理程序方法,以便为将inheritance此类的某些类型的控制器提供一般error handling(这些控制器将返回JSON结果)。 当控制器引发exception时,永远不会调用OnException方法。 有谁看到我做错了什么,还是有更好的方法来处理这种情况?

使用MVC 1.0

基类:

public class APIController : Controller { protected override void OnException(ExceptionContext filterContext) { //This is never called filterContext.Result = new JsonResult(); base.OnException(filterContext); } } 

inheritance类:

 public class MyController : APIController { public AjaxResult ForcedException() { throw new SystemException(); } } 

如果我正确理解您的问题 – 您的exception必须在OnException中标记为“已处理”。 试试这个:

 filterContext.ExceptionHandled = true; 

MSDN文档( http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onexception.aspx )声明OnException方法“在操作中发生未处理的exception时被调用”。

所以,听起来它可能只在动作方法中发生未处理的exception时触发。

我用一个Index动作创建了一个新的控制器。 并且OnException方法实际上确实执行。 我也试过抛出一个SystemException()和OnException方法。

  public ActionResult Index ( ) { throw new NotImplementedException ( ); } 

您是通过unit testing还是通过ASP.NET调用控制器操作? 如果您在测试中直接调用该方法,比如通过NUnit调用,那么OnException将不会触发:测试框架将处理exception并将其转换为失败的测试。

我在ASP.NET MVC 3项目中遇到了完全相同的问题。

事实certificate,这是Visual Studio和开发服务器的一个function。 在调试模式下,您将返回到Visual Studio并给出默认的exception对话框。

阻止这种情况发生的一种方法是更改Web.config的编译模式:

  

对此:

  

您也可以将调试模式设置为true,但是通过从visual studio菜单中选择Start without debugging option来测试您的应用程序是否有效(通过按Ctrl+F5调用。

HandleErrorAttribute相同的规则适用于Controller.OnException

HandleErrorAttribute所需的配置在HandleErrorAttribute注明https://stackoverflow.com/a/528550/939634

如果web.config customError设置为mode="RemoteOnly"并且您正在本地调试或者您有mode="Off" ,则不会处理exception,您将看到带有堆栈跟踪的ASP.Net黄色屏幕。

如果设置mode="On"或者您正在远程查看站点并且具有mode="RemoteOnly" OnException方法将正确执行。

[HandleError]属性应用于类。