如何处理"默认" ASP.NET MVC中的异常?

时间:2017-03-27 10:51:45

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

想象一下这种情况:

var url="https://mywebsite.com/part1/2017/03/27/part2/part3/index.html";
var re=/[a-z0-9]+\/\d{4}\/(\d{2}\/){2}[a-z0-9]+\//;
var match=re.exec(url)[0];
console.log(match);

这最终导致黄色死亡屏幕而不是我的错误控制器。我当然可以掩饰,但我想要回到这里。所以,我尝试了这个:

public ActionResult MyAction(int myParam)
{
    if(ModelState.IsValid)
    {
        // do something useful
        return RedirectToAction("NextAction");
    }

    return RedirectToAction("Error", "Error");
}

但是那不会编译,说并非所有路径都返回一个值,即使通过该代码的任何路径都应该以ActionResult结束。如果你把返回放在public ActionResult MyAction(int myParam) { try { if(ModelState.IsValid) { // do something useful return RedirectToAction("NextAction"); } } catch(Exception ex) { return RedirectToAction("Error", "Error"); } } 命令中,抱怨" Control不能离开finally子句的主体"。

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

3 个答案:

答案 0 :(得分:2)

你无法编译,因为你忘了这部分

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

捕获控制器中的异常

在控制器中我们有方法OnException.override那个方法并写下你的逻辑。

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

在全球范围内捕捉异常 我们有一个方法 Application_Error(对象发送者,EventArgs e),我们可以捕获异常并在system.webconfig文件中显示带有标记的自定义页面

使用处理错误属性,我们也可以执行此操作并指定不同的错误页面。 [HandleError(ExceptionType = typeof(NullReferenceException),View =&#34; Error&#34;)]