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

本文介绍了ASP.NET中的多种异常处理方式,包括TRYCATCH代码段、Application_Error事件、Page_Error方法及使用HttpModule捕获未处理异常的方法。同时,还详细说明了如何记录异常日志。

 

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的专栏 - 博客频道 - youkuaiyun.com.htm

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

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

### PAIP编程珠玑中的示例代码解释 PAIP(Paradigms of Artificial Intelligence Programming)是一本深入探讨人工智能编程范式的书籍,其中包含了大量 Lisp 编写的程序实例。这些例子不仅展示了如何实现特定的人工智能算法,还提供了关于良好软件工程实践的重要见解。 #### 示例:通用求解器框架 书中介绍了一个名为 `defun` 的宏来定义函数,在构建通用问题解决器时非常有用[^1]: ```lisp (defun solve (problem) "Find a solution to the given problem." (let ((solution nil)) ;; Attempt to find a solution using backtracking. (labels ((try-next-option () (when (not solution) (if (no-more-options-p ()) (return-from try-next-option nil) (let* ((option (next-option))) (cond ((goal-reached-p option) (setf solution option)) (t (push-state option) (solve problem) (pop-state)))))))) (try-next-option) solution))) ``` 这段代码实现了回溯法解决问题的一般模式。通过递归调用自身并尝试不同的选项直到找到解决方案为止。如果当前路径无法通向目标,则会恢复之前的状态继续探索其他可能性。 此方法能够有效地处理许多复杂的组合优化类问题,并且由于其灵活性可以很容易地适应各种具体应用场景下的需求变化。 #### 示例:自然语言理解模块 另一个重要的部分涉及到了自然语言处理技术的应用案例——基于语法分析树结构来进行语义解析: ```lisp (defun parse-sentence (sentence) "Parse SENTENCE into its constituent parts and build an interpretation tree." (multiple-value-bind (subject verb-object) (split sentence 'verb) `(sentence :subject ,(parse-noun-phrase subject) :action ,verb-object))) (defun parse-noun-phrase (np-string) "Interpret NP-STRING as either a simple noun or compound phrase." ...) ``` 上述片段演示了如何将输入字符串分割成主谓宾成分,并进一步解析名词短语的具体含义。这种层次化的表示方式有助于后续更高级别的推理操作以及对话管理等功能的设计与实现。 #### 示例:专家系统规则引擎 最后值得一提的是书中对于专家系统的讨论,特别是有关于事实库管理和匹配机制的部分: ```lisp (defstruct fact id pattern bindings) (defun match-patterns (pattern facts) "Return all FACTS that unify with PATTERN, along with their BINDINGS." ...) (defun add-fact (kb new-fact) "Add NEW-FACT to knowledge base KB after checking consistency against existing rules." ...) ``` 这里展示了一种简单而有效的知识表达形式及其相应的查询接口设计思路。通过对模式进行统一化计算从而快速定位符合条件的事实条目;而在更新数据库前则需确保新加入的信息不会引起逻辑矛盾等问题的发生。 以上仅是从《Programming Pearls》一书摘取的一些精彩片段,实际上该著作涵盖了更为广泛的内容领域和技术细节等待读者去发掘学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值