达林已经给出了正确答案,但我想更深入一点。
在任何 ASP.NET 应用程序中,如果它是 Web 窗体、MVC 或原始 ASP.NET,您始终可以使用Application_Error Global.asax。如果您的 ASP.NET 应用程序没有 Global.asax,您只需在解决方案资源管理器中右键单击您的项目,添加新项,然后选择 Global Application Class。如果您还没有此选项,则应该只提供此选项。
在您的 Global.asax 中,如果您还没有看到,可以添加Application_Error,如下所示:
protected void Application_Error(object sender, EventArgs e) {
}
只要出现错误,ASP.NET 就会自动调用它。但正如here 所述,这并不完美。具体来说:
在 Global.asax 文件中定义的错误处理程序只会
捕获在 ASP.NET 处理请求期间发生的错误
运行时。例如,如果用户请求
.aspx 文件不会出现在您的应用程序中。 但确实如此
如果用户请求不存在的 .htm 文件,则不会捕获错误。为了
非 ASP.NET 错误,您可以在 Internet 中创建自定义处理程序
信息服务 (IIS)。 自定义处理程序也不会被调用
服务器级错误。
在Application_Error 中,您可以使用Server.GetLastError() 处理未捕获的异常。这将为您提供被抛出的Exception,或null。我不确定如果没有发生异常,为什么会调用这个处理程序,但我相信这是可能的。
要重定向用户,请使用Response.Redirect()。无论您为url 传递什么,都将直接发送到浏览器而无需任何进一步处理,因此您不能使用应用程序相对路径。为此,我会将此方法与VirtualPathUtility.ToAbsolute() 结合使用。例如:
Response.Redirect( VirtualPathUtility.ToAbsolute( "~/Error.aspx" ) );
此重定向将是 302(临时重定向)而不是 301(永久),这是您在处理错误时想要的。值得注意的是,Response.Redirect 的这个重载与调用 Response.Redirect(url, endResponse: true) 的重载是一样的。此方法通过抛出异常来工作,这在性能方面并不理想。相反,请立即拨打Response.Redirect(url, false),然后拨打Response.CompleteRequest()。
如果您使用的是 ASP.NET MVC,[HandleError] 也是一个选项。将此属性放置在您的控制器上或控制器内的操作上。当此属性存在时,MVC 将显示错误视图,该视图位于 ~/Views/Shared 文件夹中。
但您可以让这一切变得更容易。您可以通过在项目中创建FilterConfig 类来自动添加此属性以调用项目中的控制器。示例:
public class FilterConfig {
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new HandleErrorAttribute());
}
}
然后将 FilterConfig.RegisterGlobalFilters( GlobalFilters.Filters ); 添加到 Global.asax 中的 Application_Start()。
您可以在https://msdn.microsoft.com/en-us/library/system.web.mvc.handleerrorattribute(v=vs.118).aspx 阅读有关HandleErrorAttribute 的更多信息。
但如上所述,这两种方法都不会绝对涵盖在处理您的应用程序期间可能发生的所有错误。如果不使用 Web.config 或手动配置 IIS,就不可能为所有可能的错误提供最佳用户体验。