Application_Error应用

本文详细介绍了如何在ASP.NET应用程序中捕获未处理的错误,并通过日志记录错误详情,包括发生时间、异常页、异常信息、错误源和堆栈信息。此外,提供了一个自定义错误页面的实现,用于优雅地展示错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码
Exception objErr = Server.GetLastError().GetBaseException();
string error = string.Empty;
string errortime = string.Empty;
string erroraddr = string.Empty;
string errorinfo = string.Empty;
string errorsource = string.Empty;
string errortrace = string.Empty;
error += "发生时间:" + System.DateTime.Now.ToString() + "<br>";
errortime = "发生时间:" + System.DateTime.Now.ToString();
error += "发生异常页: " + Request.Url.ToString() + "<br>";
erroraddr = "发生异常页: " + Request.Url.ToString();
error += "异常信息: " + objErr.Message + "<br>";
errorinfo = "异常信息: " + objErr.Message;
errorsource = "错误源:" + objErr.Source;
errortrace = "堆栈信息:" + objErr.StackTrace;
error += "--------------------------------------<br>";
Server.ClearError();
Application["error"] = error;
//独占方式,因为文件只能由一个进程写入.
System.IO.StreamWriter writer=null;
try
{
lock (this)
{
// 写入日志
string year = DateTime.Now.Year.ToString();
string month = DateTime.Now.Month.ToString();
string path = string.Empty;
string filename = DateTime.Now.Day.ToString() + ".txt";
path = Server.MapPath("~/Error/") + year + "/" + month;
//如果目录不存在则创建
if (!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
System.IO.FileInfo file = new System.IO.FileInfo(path + "/"+filename);

//文件不存在就创建,true表示追加
writer = new System.IO.StreamWriter(file.FullName, true)
writer.WriteLine("用户IP:" + Request.UserHostAddress);
writer.WriteLine(errortime);
writer.WriteLine(erroraddr);
writer.WriteLine(errorinfo);
writer.WriteLine(errorsource);
writer.WriteLine(errortrace);
}
}
finally
{
if (writer != null)
writer.Close();

}
Response.Redirect("~/Error/ErrorPage.aspx");

}



ErrorPage.aspx
<head runat="server">
<title>出错信息</title>
<link href="css/SITE.CSS" type="text/css" rel="stylesheet" />
</head>
<body>
<form id="form1" runat="server">
<asp:Label ID="Label1" runat="server" Width="568px"></asp:Label>

</form>
</body>

ErrorPage.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
this.Label1.Text = Application["Error"].ToString();
}

当然,错误页你可以不显示具体的错误信息,而是给用户一个友好的提示页面。


原帖地址:http://blog.youkuaiyun.com/w809026418/archive/2009/08/19/4462237.aspx
<think>好的,用户想了解Application_Error,我需要先确定他们指的是哪个技术领域的。通常来说,Application_Error在ASP.NET中是一个事件,用于处理应用程序级别的错误。不过,也有可能用户指的是其他框架或环境中的类似概念,但考虑到常见性,先假设是ASP.NET的情况。 首先,我应该解释Application_Error的基本概念和作用。需要说明它属于全局错误处理机制,可以捕获未被处理的异常,这对于记录日志或自定义错误页面非常有用。接下来,应该分步骤说明如何使用它,比如在Global.asax文件中编写代码,并提供示例代码,这样用户能更清楚实现方式。 然后,需要提到相关的注意事项,比如事件触发的顺序,与其他错误处理方法的结合使用,比如Page_Error和web.config中的customErrors或healthCheck配置。同时,要强调即使有Application_Error,也应在代码中处理预期内的异常,而不是依赖全局处理。 另外,用户可能想知道实际应用场景,比如日志记录、友好错误页面、异常过滤等,这部分需要举例说明,让用户明白如何应用这些知识。还要注意语法正确性,确保代码示例中的LaTeX格式正确,但根据用户指令,数学公式使用$...$,而代码示例可能不需要数学公式,所以需要判断是否涉及数学表达式。 最后,检查是否用中文清晰回答,结构是否合理,是否分点说明,以及是否覆盖了用户可能关心的问题。比如,用户可能想知道为什么使用Application_Error,与其他错误处理方式的区别,以及最佳实践。需要确保这些点都有涵盖,并且语言通俗易懂,避免过于技术化的术语,同时保持准确性。</think>在ASP.NET应用程序中,`Application_Error` 是一个重要的全局错误处理机制,其核心作用和应用场景如下: $\textcolor{red}{✓ \textbf{基本概念}}$ 这是定义在Global.asax文件中的事件处理方法,当应用程序中任何未被处理的异常发生时自动触发。属于$\text{最高层级的错误拦截手段}$。 $\textcolor{blue}{➤ \textbf{实现步骤}}$ 1. 在项目中打开Global.asax文件 2. 添加以下代码框架: ```csharp protected void Application_Error(object sender, EventArgs e) { Exception ex = Server.GetLastError(); // 自定义处理逻辑 Server.ClearError(); } ``` $\textcolor{green}{❗ \textbf{典型应用场景}}$ - $\text{集中式日志记录}$:将异常信息写入数据库或文件系统 ```csharp Logger.Log(ex.ToString()); // 示例日志记录 ``` - $\text{动态错误页面}$:根据异常类型跳转不同页面 ```csharp if (ex is HttpRequestValidationException) Response.Redirect("/Error/Security"); ``` - $\text{异常过滤}$:识别特定异常并进行特殊处理 ```csharp if (ex.InnerException is SqlException) SendAlert("数据库异常"); ``` $\textcolor{orange}{⚠️ \textbf{注意事项}}$ 1. 必须调用`Server.ClearError()`防止错误继续传递 2. 需配合web.config配置使用: ```xml <system.web> <customErrors mode="On" /> </system.web> ``` 3. 与`Page_Error`事件的区别:后者仅处理页面级异常,而前者覆盖整个应用 $\textcolor{purple}{★ \textbf{最佳实践}}$ - 建议结合ELMAH等日志框架增强功能 - 生产环境应关闭详细错误信息: ```csharp protected void Application_Error() { if (!Context.IsDebuggingEnabled) { Response.TrySkipIisCustomErrors = true; Response.StatusCode = 500; } } ``` 通过合理使用此方法,可显著提升应用程序的$\text{健壮性}$和$\text{可维护性}$,建议在项目中建立完整的错误处理链: $$\text{try-catch} \rightarrow \text{Page_Error} \rightarrow \text{Application_Error} \rightarrow \text{customErrors}$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值