[英]How to handle “default” exceptions in ASP.NET MVC?
想象一下这种情况:
public ActionResult MyAction(int myParam)
{
if(ModelState.IsValid)
{
// do something useful
return RedirectToAction("NextAction");
}
return RedirectToAction("Error", "Error");
}
最终显示在死亡的黄色屏幕上,而不是我的错误控制器上。 我当然可以掩盖,但是我想在这里回来。 因此,我改为尝试此操作:
public ActionResult MyAction(int myParam)
{
try
{
if(ModelState.IsValid)
{
// do something useful
return RedirectToAction("NextAction");
}
}
catch(Exception ex)
{
return RedirectToAction("Error", "Error");
}
}
但这不会编译,因为并不是所有路径都返回一个值,即使该代码中的任何路径都应以ActionResult结尾。 如果将return放在finally
命令中,并抱怨“控件无法离开finally子句的主体”,则相同。
有没有更好的方法来解决这个问题,还是我必须在此控制器操作的底部留下一个悬挂的默认返回值?
您不能编译它,因为您忘记了这部分
public ActionResult MyAction(int myParam)
{
try
{
if(ModelState.IsValid)
{
// do something useful
return RedirectToAction("NextAction");
}
else{
return RedirectToAction("Error", "Error");
}
}
catch(Exception ex)
{
return RedirectToAction("Error", "Error");
}
}
如果此模型状态无效,则不会重用View。
好吧,有更好的方法。 您可以为控制器创建基本控制器,然后可以覆盖OnException方法,该方法将在子类操作方法中发生任何异常时触发。 然后,您可以从那里渲染错误页面,或执行一些自定义的常见错误处理。 因此,您不需要尝试捕获。
protected override void OnException(ExceptionContext filterContext)
{
RedirectToAction("Error", "Error");
}
顺便说一句:如果您不熟悉MVC,我强烈建议您使用T4模板从您的视图生成“强类型”路径。
您可以通过其他方式执行此操作。
在控制器中捕获异常
在控制器中,我们有OnException.override方法并编写您的逻辑。
<customErrors mode="On">
<error statusCode="500" redirect="ErrorPage.htm"/>
</customErrors>
在全局级别捕获异常,我们有一种方法Application_Error(object sender,EventArgs e) ,我们可以在其中捕获异常并在system.webconfig文件中显示带有标签的自定义页面
我们也可以使用handle error属性来指定不同的错误页面。 [HandleError(ExceptionType = typeof(NullReferenceException),View =“ Error”)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.