想象一下这种情况:
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子句的主体"。
有没有更好的方法来处理这个问题,或者我是否必须在此控制器操作的底部留下悬空的默认返回值?
答案 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;)]