Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理ASP.NET MVC中的“默认”异常?_C#_Asp.net_Asp.net Mvc_Error Handling - Fatal编程技术网

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

C# 如何处理ASP.NET MVC中的“默认”异常?,c#,asp.net,asp.net-mvc,error-handling,C#,Asp.net,Asp.net Mvc,Error Handling,想象一下这个场景: public ActionResult MyAction(int myParam) { if(ModelState.IsValid) { // do something useful return RedirectToAction("NextAction"); } return RedirectToAction("Error", "Error"); } 这最终会出现在死亡的黄色屏幕上,而不是我的错误控制器上。

想象一下这个场景:

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结束。如果将返回放在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");
    }
}

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

好吧,有更好的方法。您可以为控制器创建基本控制器,并且在那里您可以重写OneException方法,该方法将在子类动作方法中发生任何异常时触发。然后,您可以从那里呈现错误页面,或者执行一些自定义的常见错误处理。所以你不需要试着接球

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

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

您可以通过不同的方式来完成这项工作

捕获控制器中的异常

在控制器中,我们有方法OneException.override该方法并编写逻辑

 <customErrors mode="On">
      <error statusCode="500" redirect="ErrorPage.htm"/>
    </customErrors>
在全局级别捕获异常 我们有一个方法应用程序\u Errorobject sender,EventArgs e,在这里我们可以捕获异常并在system.webconfig文件中显示带有标记的自定义页面

使用handleerror属性,我们也可以这样做,并指定不同的错误页面。
[HandleErrorExceptionType=typeofNullReferenceException,View=Error]

这是说并非所有路径都返回值,因为并非所有路径都返回值如果ModelState.IsValid为false怎么办?