以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  自己做一个ExceptionLOG  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11741)


--  作者:admin
--  发布时间:11/9/2004 2:25:00 AM

--  自己做一个ExceptionLOG


发信人: hBifTs (Programing?Reverse:Crack...), 信区: DotNET
标  题: 自己做一个ExceptionLOG
发信站: BBS 水木清华站 (Wed Mar 31 21:55:43 2004), 转信

  
    http://www.cnblogs.com/hbifts/archive/2004/03/30/4655.aspx

   看到了li-new的新文章获得系统异常的详细信息后,想到了前几天玩过的DynamicProxy和AOP,如果把这两个结合起来,不就是一个自定义的异常记录系统了么?
嗯,说做就做.

在这里,我没有使用JGTM的使用RealProxy的方法,原因我已在Dynamic For .NET中说得很明白了,不是吗:)

我们先写一个接口
public interface ICalculator{
  void Run();
}
再实现我们的类.
public class Calculator : ICalculator{
  public void Run(){
   Console.WriteLine("hell,this is the run");
  }
}

好了..现在我们就得写记录异常信息的类了...
记录异常信息,那得有一个Exception或是它的子类.嗯,Good~,我们写一个接口(为什么要写个接口?直接写类不是方便的多吗?为什么要这么麻烦呢?)
public interface ILog{
  object LogException(Exception ex);
  void Write(object res);
}

实现这个接口:
public class Log : ILog
{
  #region ILog Members

  public object LogException(Exception ex)
  {
   // TODO:  Add Log.Write implementation
//这个地方的代码取自于获得异常信息的详细信息
   StackTrace trace = new StackTrace(ex,true);
   StackFrame sf;
   string res = "";
   MemberInfo mi;
   for(int i=0;i<trace.FrameCount;i++){
    sf = trace.GetFrame(i);
    mi = sf.GetMethod();
    res = mi.DeclaringType.Namespace + ".";
    //class名  
    res = res + mi.DeclaringType.Name + ".";
    res = res + mi.Name;
    //取得文件名(物理路径)、行号,列号
    if(sf.GetFileName() != string.Empty){
     res = res + sf.GetFileName() + ",Line" + sf.GetFileLineNumber() + ",Col" + sf.GetFileColumnNumber();
    }
   }
   Write(res);    
   return res;
  }

  public void Write(object res){
   Console.WriteLine(res);
  }

  #endregion

}
在这里我们可以看到,LogException(...)函数就是用来从异常中取得信息,Write(...)函数就是用来把得到的异常信息通过命令行显示出来 : )
而且,在这里我是直接在LogException中调用Write的..

好了,记录异常的类Log已经写完了.现在该写在LogFactory类了:P
同样的,我们的LogFactory从DynamicProxy.IProxyInvocationHandler继承(不要问我为什么,去看DynamicProxy的代码自会明白)
public class LogFactory : DynamicProxy.IProxyInvocationHandler
然后再构造函数
由于我们要使用Log这个类来记录异常信息,所以构架函数是这样子的:
  private object target;
  private ILog log;

  public LogFactory(object obj){
   target = obj;
  }

  public LogFactory(object obj,ILog log){
   target = obj;
   this.log = log;
  }

再实现生成动态代理的函数:

  public object Create(){
   return ProxyFactory.GetInstance().Create(this,target.GetType());
  }
这就是函数调用的地方了:

  public object Invoke(object proxy, System.Reflection.MethodInfo method, object[] parameters){
   // TODO:  Add LogFactory.Invoke implementation
   try{    
    object result =  method.Invoke(target,parameters);
    return result;
   }
   catch(Exception ex){
    if(log != null){ //判断log类是否不为空,如果为空,即不用记录:P
     log.LogException(ex);
    }
    return null;
   }
  }

该写的都写了~再就是测试用例了:P
//这里不需要记录异常
  [Test] public void TestRun(){
   ICalculator cal = (ICalculator)(new LogFactory(new Calculator()).Create());
   cal.Run();    
  }

//这里记录异常的信息

  [Test] public void TestLogRun(){
   ICalculator cal = (ICalculator)(new LogFactory(new Calculator(),new Log()).Create());
   cal.Run();
  }

OK了.,,这样子我们就完成了一个简单的异常记录系统(姑且这样子说吧)...
呵呵...我们还可以进一步写我们的XMLLog类,把异常信息记录到一个XML文件中,或是再写一个EnvenLog类,把异常信息放进系统的事件中:P  



源代码下载: exceptionLog

http://www.showyes.com/hbifts/exceptionLog.zip

DynamicProxy http://www.cnblogs.com/hbifts/archive/2004/03/26/4251.aspx

--

                  just for fun~~~~

      山自高兮水自深!當塵霧消散,唯事實留傳


※ 修改:·hBifTs 于 Mar 31 21:56:15 修改本文·[FROM:   218.197.209.*]
※ 来源:·BBS 水木清华站 smth.org·[FROM: 218.197.209.*]
上一篇
返回上一页
回到目录
回到页首



W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms