CSDN博客

img devercn

dever.cn中的异常处理

发表于2004/6/22 23:21:00  1281人阅读

回想起靠关键字或错误代码定义异常的ASP时代,现在JAVA和.net中的异常处理机制实在是进步的太多了。 

先定义一个异常源的struct

 public struct ErrorItem
 {
  public string UserIp ;//用户IP
  public string Page ;//错误发生的页面
  public string Resource ;//错误源
  public string ErrorInfo ;//错误信息
  public DateTime ErrorTime ;//错误发生的时间
 }

以下是一些我用到的主要异常处理方法: 

public static void setError(Exception e)
  {
   System.Web.HttpContext hc = System.Web.HttpContext.Current;

   // 将捕获的异常实例分解并处理
   ErrorItem ei = new ErrorItem();

   ei.ErrorInfo = e.Message;
   ei.Resource = e.Source;
   ei.Page = hc.Request.Path;
   ei.UserIp = hc.Request.UserHostAddress.ToString();
   ei.ErrorTime = DateTime.Now;
   
   saveError(ei,true); //调用错误处理函数
}


  public static void saveError(ErrorItem errItem,bool isView)
  {
   // 将错误信息写库供显示用
   System.Web.HttpContext hc = System.Web.HttpContext.Current;
   string strSql = "update error set ------------" 
   SqlHandle.ExecuteUpdateQuery(strSql)

   ErrorHandle eh = new ErrorHandle()
   // 判断日志文件是否存在,不存在则新建
   eh.isExistLog()
   // 将错误信息写入日志文件
   XmlElement xErrorElement = xmlDoc.CreateElement("error") ;

   eh.AddXmlAttribute(xErrorElement,"time",errItem.ErrorTime.ToString());
   eh.AddXmlAttribute(xErrorElement,"resource",errItem.Resource);
   eh.AddXmlAttribute(xErrorElement,"page",errItem.Page);
   eh.AddXmlAttribute(xErrorElement,"ip",errItem.UserIp);
   xErrorElement.InnerText = errItem.ErrorInfo ;
   xmlRoot.AppendChild(xErrorElement) ;

   if(isView)
   {
    hc.Response.Redirect( DeverClass.getRoot("ErrorHandle.aspx") );
   }
  }

// 用弹出窗口弹出错误信息并自动回退
  public static void popError(string strError)
  {
   System.Web.HttpContext hc = System.Web.HttpContext.Current;
   hc.Response.Write(" ");
  }

  // 用弹出窗口弹出错误信息,第二个参数为返回页面
  public static void popError(string strError,string strRePage)
  {
   System.Web.HttpContext hc = System.Web.HttpContext.Current;
   hc.Response.Write(" ");
  }

setError方法处理的是程序中try{}中捕获的错误,将异常实例的信息分解后交给saveError来处理。saveError方法处理这些异常的同时也处理一些自定义的异常。参数isView控制是否要将错误显示给用户。

popError处理一些用户操作上的错误,比如说登陆时输入错误等,此类错误不影响程序运行,只要弹出个小窗口提示一下就OK。


异常处理一个很重要的环节是记录日志,将异常写到库里比较方便,但存在一个致命弱点,就是它会使数据库变的很大且难以控制,所以一般不推荐,我采用的方法是,将异常写到库里,注意是update而不是insert。这样库里永远就只有最新发生的一条异常。这条异常主要是显示给用户看的。异常写库的同时也将异常写到日志文件中,我写在一个XML文件中,查询历史记录时可直接显示XML文件中的内容。 

在程序中捕获异常是控制程序正常运转的好办法,但并不能解决所有问题,因为我们不能把整个程序包在一个try块中,或者程序里到处是try块,这样都是低效的,明智的做法是预测可能发生的异常并捕获,对于一些预测不到的错误就交给系统来帮我们捕捉吧。

修改Global.asax.cs中的Application_Error方法,这个方法是在发生错误时系统自动调用的,当然对于try{}块中的错误它是不处理,因为它的错误处理优先级低于用户自定义异常处理。下面是我改写的该函数

protected void Application_Error(Object sender, EventArgs e)
  {
      if(System.Configuration.ConfigurationSettings.AppSettings["ErrorView"].Equals("ON"))
     {
         System.Web.HttpContext hc = System.Web.HttpContext.Current;
         // 自定义错误信息
         ErrorItem ei = new ErrorItem();

         ei.ErrorInfo = "未捕获的错误";
         ei.Resource = "未知";
         ei.Page = hc.Request.Path;
         ei.UserIp = hc.Request.UserHostAddress.ToString();
         ei.ErrorTime = DateTime.Now;
         ErrorHandle.saveError( ei,true );  //此处为出错处理
     }
 }

函数的处理根据你的需要来写。最好是在处理前加一个判断,因为有的时候我们并不希望它执行,比如说调试阶段。在web.config中加个开关值就OK了。


   

如果你觉得这样很麻烦,又或者你根本就不在意那些未捕获的异常,那好吧,有一些工作你还是应该做的。修改web.config文件。

    defaultRedirect = "Error.aspx" 
    mode="On"   
    />  

现在你的程序看起来就完美多了,再也不会出现令用户不快的黄底黑字了。

以上这些方法为便于大家理解,我写的都比较简单,一些处理函数也省去了,比如说在将错误信息写库时,一定要过滤,因为错误信息中可能会包含单引号。

0 0

相关博文

我的热门文章

img
取 消
img