paip.提升用户体验---程序异常处理
作者Attilax, 1466519819@qq.com
1.程序的代码段TRY CATCH中,这是最直接处理异常的地方。如下...1
2. ASP.NET的中的Application_Error中.Application_Error事件...1
4..通过HttpModule来捕获未处理的异常【推荐】...2
asp.net异常处理的位置大概有以下3个地方
1. 程序的代码段TRY CATCH中,这是最直接处理异常的地方。如下
try
{
n=Convert.ToInt32(info);
}
catch(Exception)
{
}
2. ASP.NET的中的Application_Error中.Application_Error事件
。对于应用程序中引发的任何未处理异常都会引发此事件。
VS2010 〈〉新建立"应用程序类">生成 Global.asax。出错管理页面是在global.asax里面的,因为里面有一个Application_Error函数,
一般我们处理如下
protected void Application_Error(Object sender, EventArgs e)
{
Exception exp=Server.GetLastError();
//ErrorLog.Log(exp);
//====================================
string strE="内部错误:"+e.InnerException.ToString()+"/r/n堆栈:"+e.StackTrace+"/r "+"Message:"+e.Message+"/r来源:"+e.Source;
Log(strE);
Server.ClearError();
Server.Transfer("Error.aspx",false);
}
这样我们就可以处理Server端出现的错误。我们记录出错的源头。
3. Page_Error方法
也可以在页级别或者应用程序级别处理代码错误。Page基类公开了一个 Page_Error 方法,此方法在页中可以被重写。每当运行时引发未捕获的异常时都调用此方法。
protected void Page_Error(object sender, EventArgs e)
{
string errorMsg = String.Empty;
Exception currentError = Server.GetLastError();
errorMsg += "来自页面的异常处理<br />";
errorMsg += "系统发生错误:<br />";
errorMsg += "错误地址:" + Request.Url + "<br />";
errorMsg += "错误信息:" + currentError.Message + "<br />";
Response.Write(errorMsg);
Server.ClearError();//清除异常(否则将引发全局的Application_Error事件)
}
4..通过HttpModule来捕获未处理的异常【推荐】
<system.webServer>
<modules>
<addname="atiTryCatch"type="atiTryCatch"/>
</modules>
publicvoid Init(HttpApplication context)
{
context.Error+=new EventHandler(Application_Error);
}
voidApplication_Error(object sender, EventArgse)
{
………………………….
}
通过handlers
HttpModule与handlers的区别就是Hhandlers仅适用于捕获.NET程序的异常……因为其它文件不经过ISAPP.DLL…
所以handlers才更与JAVA中的FILTER类似..
日志格式与内容
void Application_Error(objectsender, EventArgse)
{
HttpApplicationapplication= (HttpApplication)sender;
HttpContextctx=HttpContext.Current;
HttpResponseresponse=ctx.Response;
// HttpRequest request =
HttpServerUtilityServer=application.Server;
HttpRequestRequest=ctx.Request;
//在¨²出?现?未¡ä处ä|理¤¨ª的Ì?错䨪误¨®时º¡À运?行D的Ì?代䨲码?
// 在¨²出?现?未¡ä处ä|理¤¨ª的Ì?错䨪误¨®时º¡À运?行D的Ì?代䨲码?
// 在¨²出?现?未¡ä处ä|理¤¨ª的Ì?错䨪误¨®时º¡À运?行D的Ì?代䨲码?
ExceptionobjErr=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+="发¤¡é生¦¨²异°¨¬常¡ê页°3: " +Request.Url.ToString() +"<br>";
erroraddr="发¤¡é生¦¨²异°¨¬常¡ê页°3: " +Request.Url.ToString();
error+="异°¨¬常¡ê信?息¡é: " +objErr.Message+"<br>";
errorinfo="异°¨¬常¡ê信?息¡é: " +objErr.Message;
errorsource="错䨪误¨®源¡ä:"+objErr.Source;
errortrace="堆?栈?信?息¡é:"+objErr.StackTrace;
error+="--------------------------------------<br>";
// Server.ClearError();
// Application["error"] = error;
//独¨¤占?方¤?式º?,ê?因°¨°为a文?件t只?能¨¹由®¨¦一°?个?进?程¨¬写¡ä入¨?.
System.IO.StreamWriterwriter=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() +".html";
path=Server.MapPath("~/LogErr/")+year+"/"+month;
//如¨?果?目?录?不?存ä?在¨²则¨°创ä¡ä建¡§
if (!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
System.IO.FileInfofile=new System.IO.FileInfo(path+"/"+filename);
//文?件t不?存ä?在¨²就¨ª创ä¡ä建¡§,true表À¨ª示º?追Á¡¤加¨®
writer= new System.IO.StreamWriter(file.FullName,true);
string ip="用®?户¡ìIP:"+Request.UserHostAddress;
string line="-----------------------------------------------------";
string log="<p style='font-size:9pt;'><br>"+line+"<br><font color=red>"+errortime+" "+erroraddr+"</font><br><font color=green>"+"<br/>"+ip+errorinfo+"<br>"+errorsource+"<br>"+errortrace.Replace("\r\n","<br>") +"</font></p>";
writer.WriteLine(log);
}
}
finally
{
if (writer!=null)
writer.Close();
}
}
查看所有加载的HttpModule
private string ShowModules()
{
HttpApplicationapp=Context.ApplicationInstance; //获?取¨?当Ì¡À前¡ã上¦?下?文?的Ì?HttpApplication环¡¤境3
HttpModuleCollectionmoduleCollection=app.Modules; //获?取¨?所¨´有®DModule集¡¥合?
// 获?取¨?所¨´有®D的Ì? Module 名?称?
string[] moduleNames=moduleCollection.AllKeys;
System.Text.StringBuilderresults=new System.Text.StringBuilder(); //遍À¨¦历¤¨²结¨¢果?集¡¥
foreach (stringname in moduleNames)
{
// 获?得Ì?Module名?称?
results.Append("<b style='color:#800800'>名?称?:êo"+name+"</b><br />");
// 获?得Ì?Module类¤¨¤型¨ª
results.Append("类¤¨¤型¨ª:êo"+moduleCollection[name].ToString()+"<br />");
}
return results.ToString();
}
HttpModule不起作用,调试
原因:IIS版本问题
IIS6 写在<system.web>中.
用IIS7。而你电脑里用的是IIS5或IIS6。IIS7在你的.net的配置文件中可以单独的设置,并且是设置在<system.webServer>中的。比如URL重写。网络空间会有实例文件,你直接参照就可以了,不用你单独的写。
写在这个后面
<!--
在 Internet 信息服务 7.0 下运行 ASP.NET AJAX 需要 system.webServer
节。对早期版本的 IIS 来说则不需要此节。
-->
参考
ASP.net异常处理
ASP_NET Application_Error错误日志写入 - hongkaihua1987的专栏 -博客频道 - CSDN_NET.htm
HttpModule和Http Handler (比较与区别) - logo616的专栏 -博客频道 - CSDN.NET.htm
asp.net捕获全局未处理异常的几种方法 - OoC -博客园.htm