asp.net - 在 Asp.net Web 表单中等效的 MVC 异常过滤器
问题描述
在 MVC Web 窗体中,我们通过执行 IExceptionFilter 来获得错误过滤器。这确保了应用程序中的任何异常都将被路由到这里。
在 ASP.Net 中是否有一个等价物?是否为所有异常调用了 Application_Error 方法?
解决方案
首先,您应该查看官方文档。
你问的是 Web 窗体,然后是 ASP.NET,所以我不确定你是问 MVC 还是其他东西,但我会假设 MVC。1 & 3 无论如何都适用。
我找到了一篇更简洁的 Stackify 文章,我将在此对其进行解释。我将忽略不是全局解决方案的错误处理(HandleErrorAttribute 等)。
根据您的需要,有几个选项可用于处理未处理的异常:
1) Web.Config 部分中配置的通用错误页面
<system.web>
<customErrors mode="On" defaultRedirect="~/ErrorHandler/Index">
<error statusCode="404" redirect="~/ErrorHandler/NotFound"/>
</customErrors>
<system.web/>
如果您设置与上述代码类似的内容(将示例路径替换为错误处理程序或其他网页的路径),您可以设置默认错误页面以及每种状态代码类型的错误页面。如果您设置 mode="RemoteOnly",您将仅在不在本地主机上时看到这些自定义错误页面,这对于调试非常有用。
例如,我的项目中有以下内容:
<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 方法并通过那里处理我的错误。我发现通过使用它,以及一个开发良好的控制器来处理错误,你可以做一些强大的事情。还有比这些更多的选择,但我认为这会让你开始。
最好的。
推荐阅读
- javascript - 我如何遍历 d3.select(this)
- javascript - 在反应引导 Form.Control 中显示可编辑值
- javascript - 如何从 DocuSign JavaScript 中删除硬返回以创建 Salesforce 自定义按钮
- reactjs - TypeError:_this.props.addLead 不是反应中的函数
- javascript - JS Promise 链 .catch() 在被拒绝后不起作用
- javascript - 两个组件之间的 React js 通信
- p5.js - 在 for 循环中创建按钮,每个按钮在 p5 中都有不同的 mousePressed 函数
- python - 逻辑回归的沙普利?
- scala - 如何在 spark 1.6 中显示带有标签的不匹配报告 - scala 除了函数?
- flutter - 如何在颤振中处理 100vh?