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