zoukankan      html  css  js  c++  java
  • paip.提升用户体验程序异常处理

     

    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);

            }
     

               void Application_Error(object sender, EventArgse)

    {

    ………………………….

         }

     

    通过handlers

    HttpModulehandlers的区别就是Hhandlers仅适用于捕获.NET程序的异常……因为其它文件不经过ISAPP.DLL…

    所以handlers才更与JAVA中的FILTER类似..

    日志格式与内容

       void Application_Error(object sender, EventArgse)

    {

     

            HttpApplication application= (HttpApplication)sender;

            HttpContext ctx=HttpContext.Current;

            HttpResponse response=ctx.Response;

         //   HttpRequest request =

            HttpServerUtility Server=application.Server;

            HttpRequest Request=ctx.Request;

     

     

            //¨²??¡ää|¤¨ªÌ?䨪¨®º¡À?DÌ?䨲?

            // ¨²??¡ää|¤¨ªÌ?䨪¨®º¡À?DÌ?䨲?  

            // ¨²??¡ää|¤¨ªÌ?䨪¨®º¡À?DÌ?䨲?           

            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+="¤¡é¦¨²°¨¬¡ê°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()

        {

            HttpApplication app=Context.ApplicationInstance; //?¨?Ì¡À¡ã¦???Ì?HttpApplication¡¤3

            HttpModuleCollection moduleCollection=app.Modules; //?¨?¨´®DModule¡¥?

     

            // ?¨?¨´®DÌ? Module ??

            string[] moduleNames=moduleCollection.AllKeys;

     

            System.Text.StringBuilderresults= new System.Text.StringBuilder();    //À¨¦¤¨²¨¢?¡¥

     

            foreach (string name 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

  • 相关阅读:
    谷歌在外贸中的实战解析
    关于外贸淡季的几点看法
    如何打造完美报价单
    bbs
    你身上的所有光环,同样是套在你身上的枷锁
    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一
    用C#生成随机中文汉字验证码的基本原理
    必须根据不同的数据内容来套用不同的编码或是译码函式,以便取得对应的字节或是字符串数据
    锁和多线程:5种锁介绍(三)
    锁和多线程:3种锁的使用(二)
  • 原文地址:https://www.cnblogs.com/attilax/p/15199789.html
Copyright © 2011-2022 走看看