【问题标题】:How to handle "default" exceptions in ASP.NET MVC?如何处理 ASP.NET MVC 中的“默认”异常?
【发布时间】:2017-08-20 00:59:16
【问题描述】:

想象一下这个场景:

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 子句的主体”。

有没有更好的方法来处理这个问题,还是我必须在这个控制器操作的底部留下一个悬空的默认返回?

【问题讨论】:

  • 它的意思是“并非所有路径都返回值,因为并非所有路径都返回值如果 (ModelState.IsValid) 为假怎么办?

标签: c# asp.net asp.net-mvc error-handling


【解决方案1】:

你不能编译那个,因为你忘记了这部分

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");
    }
}

如果这是模型状态无效,则没有返回视图。

【讨论】:

    【解决方案2】:

    嗯,有更好的方法。您可以为您的控制器创建基本控制器,并在那里您可以覆盖 OnException 方法,如果您的子类操作方法中发生任何异常,该方法将触发。然后,您可以从那里呈现错误页面或进行一些自定义的常见错误处理。因此,您不需要尝试捕获。

        protected override void OnException(ExceptionContext filterContext)
        {
            RedirectToAction("Error", "Error");
        }
    

    顺便说一句:如果您是 MVC 新手,我强烈建议您使用 T4 模板从您的视图中生成“强类型”路径。

    【讨论】:

      【解决方案3】:

      你可以通过不同的方式来做这件事。

      在控制器中捕获异常

      在控制器中,我们有方法 OnException。覆盖该方法并编写您的逻辑。

       <customErrors mode="On">
            <error statusCode="500" redirect="ErrorPage.htm"/>
          </customErrors>
      

      在全局级别捕获异常 我们有一种方法 Application_Error(object sender, EventArgs e),我们可以在其中捕获异常并在 system.webconfig 文件中显示带有标签的自定义页面

      使用处理错误属性,我们也可以这样做并指定不同的错误页面。 [HandleError(ExceptionType=typeof(NullReferenceException), View="Error")]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-17
        • 2012-02-02
        • 2012-05-04
        • 2020-09-10
        相关资源
        最近更新 更多