asp.net错误处理Application_Error事件示例


在ASP.NET中,`Application_Error`事件是一个全局事件,它在应用程序中发生未处理的错误时被触发。这个事件通常在Global.asax文件中处理。下面是一个简单的`Application_Error`事件处理示例,它捕获错误、记录日志(假设你有一个LogError方法),然后重定向用户到一个友好的错误页面。

请注意,这个例子假设你有一个LogError方法来处理错误日志记录,以及一个错误页面(Error.aspx)来显示给用户。


using System;
using System.Web;

namespace YourNamespace
{
    public class Global : HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            // 应用程序启动时执行的代码
        }

        protected void Session_Start(object sender, EventArgs e)
        {
            // 会话开始时执行的代码
        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            // 请求开始时执行的代码
        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            // 安全模块建立用户身份后执行的代码
        }

        protected void Application_Error(object sender, EventArgs e)
        {
            // 捕获未处理的错误
            Exception ex = Server.GetLastError();

            // 假设LogError是一个记录错误日志的方法
            LogError(ex);

            // 清除错误
            Server.ClearError();

            // 重定向到错误页面
            Response.Redirect("~/Error.aspx");

            // 阻止ASP.NET的默认错误页面显示
            Server.Transfer("~/Error.aspx");

            // 注意:在Web Forms中,通常使用Response.Redirect,但在某些情况下(如AJAX请求),
            // 你可能想使用Server.Transfer来避免完整的页面刷新。
            // 根据你的需求选择最合适的方法。

            // 如果使用Response.Redirect,并且想防止客户端看到重定向过程,
            // 可以考虑设置Response.End()(但注意在ASP.NET中,Response.End()会抛出ThreadAbortException,
            // 因此通常将其放在try-catch块中,或者检查HttpContext.Current.Response.IsRequestBeingRedirected属性)。

            // 在这个例子中,我没有包含Response.End(),因为Server.Transfer已经足够用于内部重定向。
        }

        protected void Session_End(object sender, EventArgs e)
        {
            // 会话结束时执行的代码
        }

        protected void Application_End(object sender, EventArgs e)
        {
            // 应用程序结束时执行的代码
        }

        // 假设的LogError方法
        private void LogError(Exception ex)
        {
            // 在这里实现错误日志记录逻辑
            // 例如,写入数据库、文件或调用第三方日志服务
        }
    }
}

请注意,这个示例中的`LogError`方法是一个占位符,你需要根据你的应用程序来实现它。同样,对于错误页面的重定向,你可能需要根据你的应用程序的具体需求来调整(比如处理AJAX请求时的错误)。

此外,请确保在`Web.config`中正确配置了自定义错误页面,以便在客户端请求时显示友好的错误页面,而不是ASP.NET的默认错误页面。但是,由于`Application_Error`事件已经处理了错误并重定向,因此通常不需要在`Web.config`中为这些特定错误配置自定义错误页面。不过,为了处理未通过`Application_Error`事件捕获的错误,你仍然可以在`Web.config`中配置自定义错误页面。