paip.提升用户体验---程序异常处理

时间:2022-10-11 20:12:44

 

paip.提升用户体验---程序异常处理

 

作者Attilax 1466519819@qq.com

 

1.程序的代码段TRY CATCH中,这是最直接处理异常的地方。如下...1

2. ASP.NET的中的Application_Error.Application_Error事件...1

3. Page_Error方法...2

4..通过HttpModule来捕获未处理的异常【推荐】...2

通过handlers.3

日志格式与内容...3

查看所有加载的HttpModule.5

HttpModule不起作用,调试...6

参考...7

 

 

 

 

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

HttpModulehandlers的区别就是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而你电脑里用的是IIS5IIS6IIS7在你的.net的配置文件中可以单独的设置,并且是设置在<system.webServer>中的。比如URL重写。网络空间会有实例文件,你直接参照就可以了,不用你单独的写。
写在这个后面
<!-- 
         Internet 信息服务 7.0 下运行 ASP.NET AJAX 需要 system.webServer
        节。对早期版本的 IIS 来说则不需要此节。
-->

 

参考

ASP.net异常处理

ASP_NET Application_Error错误日志写入 - hongkaihua1987的专栏 -博客频道 - CSDN_NET.htm

HttpModuleHttp Handler (比较与区别) - logo616的专栏 -博客频道 - CSDN.NET.htm

 asp.net捕获全局未处理异常的几种方法 - OoC -博客园.htm