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怎么办?