繁体   English   中英

如何在ASP.NET MVC中处理“默认”异常?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM