在MVC Web窗体中,通过添加IExceptionFilter会出现错误Filter。这样可以确保将应用程序中的任何异常都路由到此处。
在ASP.Net中是否有与此等效的东西?是否为所有异常调用了Application_Error方法?
答案 0 :(得分:0)
首先,您应该check through the official documentation.
您先询问Web窗体,然后再指ASP.NET,所以我不确定您是否询问MVC或其他问题,但是我将假设使用MVC。 1和3均适用。
我发现a nice Stackify article更为简洁,我将在这里解释。我将忽略不是全局解决方案的错误处理(HandleErrorAttribute等)。
根据您的需求,有一些选项可以处理未处理的异常:
1)在Web.Config部分配置的通用Erorr页面
<system.web>
<customErrors mode="On" defaultRedirect="~/ErrorHandler/Index">
<error statusCode="404" redirect="~/ErrorHandler/NotFound"/>
</customErrors>
<system.web/>
如果您设置的内容与上面的代码相似(将示例路径替换为错误处理程序或其他网页的路径),则可以设置默认错误页面以及每种状态代码的错误页面。如果设置mode =“ RemoteOnly”,则仅当不在localhost上时才会看到这些自定义错误页面,这对于调试非常有用。
例如,我的项目中包含以下内容:
<customErrors mode="RemoteOnly" defaultRedirect="/ErrorHandler">
<error statusCode="400" redirect="~/ErrorHandler/?errorCode=400" />
<error statusCode="401" redirect="~/ErrorHandler/?errorCode=401" />
<error statusCode="403" redirect="~/ErrorHandler/?errorCode=403" />
<error statusCode="404" redirect="~/ErrorHandler/?errorCode=404" />
<error statusCode="500" redirect="~/ErrorHandler/?errorCode=500" />
</customErrors>
这意味着带有这些状态代码的任何一般性异常都会自动为我处理。 ErrorHandler是我为此创建的一个简单控制器。但是,这不允许您在未处理的异常上执行代码,仅显示一般错误页面。
2)在控制器上覆盖OnException函数
这需要您为控制器设置接口类,并为控制器的OnException方法开发重写方法。
在Stackify文章中,他们开发了一个名为UserMvcController的类,该类继承自Controller。我个人有一个名为IBaseController的类,该类具有重写此方法以及其他方法的方法。
一个简单界面的示例:
public class UserMvcController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
//Log the error!!
_Logger.Error(filterContext.Exception);
//Redirect or return a view, but not both.
filterContext.Result = RedirectToAction("Index", "ErrorHandler");
// OR
filterContext.Result = new ViewResult
{
ViewName = "~/Views/ErrorHandler/Index.cshtml"
};
}
}
来自我的一个项目的示例,该示例具有其他一些功能。如果您的控制器继承自您的基类,则所有这些功能都可以在您的控制器上使用:
public class IBaseController : Controller
{
// Function to set up modal pup with Error styling
public void Error(string errorHeader, string errorMessage)
{
ViewBag.ErrorHeader = errorHeader;
ViewBag.ErrorMessage = errorMessage;
ViewBag.JavaScriptHandler = "ShowErrorModal();";
}
// Function to set up modal pup with Informational styling
public void Info(string infoHeader, string infoMessage)
{
ViewBag.InfoHeader = infoHeader;
ViewBag.InfoMessage = infoMessage;
ViewBag.JavaScriptHandler = "ShowInfoModal();";
}
// Function to override OnException method to pass exception info the ErrorController
protected override void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
//Redirect or return a view, but not both.
filterContext.Result = RedirectToAction("Message", "ErrorHandler", new { area = "", errorException = filterContext.Exception.Message });
}
}
如您所见,我的OnException重写只是将某些异常信息传递给另一个控制器进行处理。我不使用它来记录或跟踪任何内容。如果您使用的是控制器,则会在所有未处理的异常上调用此方法。
3)使用Application_Error
在Global.asax文件中,您还可以设置Application_Error()函数来处理错误。
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
protected void Application_Error()
{
var ex = Server.GetLastError();
//log the error!
_Logger.Error(ex);
}
}
这将使您能够进行简单的日志记录和常规类型的错误处理。我想您可以在这里实现非常强大的功能,但是我更喜欢在控制器中进行大部分逻辑处理。
结束语
就个人而言,我更喜欢覆盖控制器的OnException方法并通过该方法处理我的错误。我发现通过使用它以及完善的控制器来处理错误,您可以做一些有力的事情。除此之外,还有更多选择,但是我认为这可以帮助您入门。
最好。