技术开发 频道

使用Aop 来处理(记录)应用程序中的异常.

[IT168 技术文档]      在日常程序开发、维护、运行过程中,经常出现各种异常,需要多处异常处理程序来捕捉异常,同时进行异常记录,有没有更方便的一种方式呢?最近在看Aop的相关实现.应用AOP来处理异常,记录相关信息,同时返回相应的错误值继续程序运行.下面我们来看看异常的相关处理信息.
(一) 首先我们先看一下异常的相关疑点..
      1.异常可以被自动传递,直到处理程序捕捉到为止.这样.
      2.UI层为了良好的用户体验,不能抛出新的异常,替代以更友好的提示信息.
      3.其它地方捕捉异常(UI外)通常处理掉/继续抛出/包装后抛出
      4.如果抛出自定义异常,最好将此异常信息描述的越清晰越好,放边定位,修改程序.
      5.开发试运营阶段,经常出现各种异常问题,或者想掌握相关调用信息,同时处理异常,那么Aop是其中一个解决办法.
(二)Aop处理异常相关应用疑点.
      1.能否捕捉到方法掉用中捕捉到所有异常.
      2.捕捉后记录详细的异常信息,包括异常所在的类、方法、传递InArgs、返回的OutArgs.
      3.记录异常后能否返回相应的返回值.
      4.Aop异常处理所带来的性能问题.
(三)Aop异常处理相关实现.
      1.先定义一个AspectAttribute,此AspectAttribute继承类Attribute,实现接口IContextAttribute,IContextProperty.同时标注 [Serializable,AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)] 保证此类可以序列化,同时可以应用到类和方法上面.有人会说了,既然应用到类上了,那里面的方法不是自动就能调用了,为什么还要定义到方法里面呢,就是可以覆盖类里面的定义

Serializable,AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)] public abstract class AspectAttribute:Attribute,IContextAttribute,IContextProperty { public virtual string Name { get { return "Aop"; } } public virtual bool IsNewContextOK(Context context) { return true; } public virtual void Freeze(Context newContext) { return; } public void GetPropertiesForNewContext(IConstructionCallMessage ctorMsg) { if (ctorMsg == null) { throw new ArgumentNullException("ctorMsg"); } ctorMsg.ContextProperties.Add(GetContextProperty(Name)); } public virtual bool IsContextOK(Context context, IConstructionCallMessage ctorCallMsg) { if(context == null) throw new ArgumentNullException("context"); if(ctorCallMsg == null) throw new ArgumentNullException("ctorCallMsg"); if(!ctorCallMsg.ActivationType.IsContextful) return true; object obj = context.GetProperty(Name); if((obj != null) && this.Equals(obj)) return true; return false; } public abstract AspectProperty GetContextProperty(string aopName); }
0
相关文章