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