Asp.net MVC中try/catch捕获异常后无法跳转自定义错误页问题
问题根源
你在try/catch块中捕获异常后,异常默认不会继续向上层传递,MVC的全局异常过滤器HandleErrorAttribute、Application_Error事件都无法感知到该异常的发生,因此不会触发自定义错误页的跳转逻辑。
可选解决方案
方案1:记录日志后重新抛出异常(推荐)
这是改动最小的方案,你只需要在日志记录完成后,通过throw关键字重新抛出原始异常即可,异常会继续向上传递触发你已经配置好的错误页逻辑:
catch(Exception ex) { string actionName = this.ControllerContext.RouteData.Values["action"].ToString(); string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString(); ErrorLogger.Log(ex.GetType().Name, controllerName + "/"+ actionName, MethodBase.GetCurrentMethod().Name, ex.Message, ex.StackTrace); // 新增:重新抛出原始异常,注意直接写throw即可,不要写throw ex,避免丢失原始异常堆栈信息 throw; }
注意:不要使用throw ex的写法,该写法会重置异常的堆栈信息,不利于后续问题排查。
方案2:手动触发自定义错误页跳转
如果你不希望异常继续向上抛出(比如有特殊的后置处理逻辑),可以在日志记录完成后手动跳转到错误页:
catch(Exception ex) { string actionName = this.ControllerContext.RouteData.Values["action"].ToString(); string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString(); ErrorLogger.Log(ex.GetType().Name, controllerName + "/"+ actionName, MethodBase.GetCurrentMethod().Name, ex.Message, ex.StackTrace); // 手动跳转到自定义错误页 TempData["Exception"] = ex; // 复杂类型异常可以存到TempData中传递 return RedirectToAction("Oops", "ErrorPage", new { statusCode = 500 }); }
对应调整ErrorPageController的Oops方法,从TempData读取异常:
public ActionResult Oops (int statusCode) { var exception = TempData["Exception"] as Exception; return View("Error"); }
注意事项
你当前配置的FilterConfig、Application_Error、web.config不需要额外修改,以上两种方案均可以兼容现有配置。
内容的提问来源于stack exchange,提问作者Rani Radcliff
相关产品推荐
相关产品推荐

