如何在方法上贴上attribute(特性)捕捉方法的异常,来实现我们的需求

    在方法上贴上attribute(特性)捕捉方法的异常,其实这么做也是为了在项目中不会大量使用try…cacth这样的语句,同时使我们的代码看起来更简洁,更直观,将逻辑业务分离使得后期维护方便。这里我们需要AOP方面的知识。(自行百度解决这知识)

 

    AOP(基于切面编程):它是对业务逻辑的分离,使各个业务直接的耦合变低,比如在传统的OOP编程中将日志记录、异常处理、权限管理等方面剥离出来。在今后的维护过程中,对其改变日志记录、异常处理、权限管理方法的时候,不用去改变主业务流程逻辑代码。提高开发效率。

    PostSharp采用特性的方式来对编译后的主业务流程方法逻辑横向静态注入截取数据。下面我们将以一个实例来演示如何使用PostSharp实现AOP进行日志记录和异常处理。

    首先需要安装PostSharp 2.1.4.1免费版本,这个版本只是功能相对较少,可商用,但能够满足日志记录和异常截取的要求。点击下载

 

    //截取方法异常并且处理异常
    [Serializable]
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    class ExceptionAttribute:MethodInterceptionAspect
    {
        //调用本函数时截取异常
        public override void  OnInvoke(MethodInterceptionArgs args)
        {
            try
            {
 	            base.OnInvoke(args);
            }
            catch(Exception ex)
            {
                Console.WriteLine(string.Format("此方法异常信息是:{0}", ex.ToString()));
            }
        }
    }
 
    //日志特性截取类
    [Serializable]
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    class LogsAttribute:OnMethodBoundaryAspect
    {
        /// <summary>
        /// 入口参数信息
        /// </summary>
        public string EntryText { get; set; }

        /// <summary>
        /// 出口参数信息
        /// </summary>
        public string ExitText { get; set; }

        /// <summary>
        /// 异常信息
        /// </summary>
        public string ExceptionText { get; set; }

        //进入方法时输出方法的输入参数
        public override void OnEntry(MethodExecutionArgs eventArgs)
        {
            Arguments arguments = eventArgs.Arguments;
            StringBuilder sb = new StringBuilder();
            ParameterInfo[] parameters = eventArgs.Method.GetParameters();
            for (int i = 0; arguments != null && i < arguments.Count; i++)
            {
                //进入的参数的值
                sb.Append( parameters[i].Name + "=" + arguments[i] + " ");
            }
            string message = string.Format("{0}.{1} Method. The Entry Arg Is:{2}",
                eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, sb.ToString());
            Console.WriteLine(message);
        }

        //退出方法时的方法返回值
        public override void OnExit(MethodExecutionArgs eventArgs)
        {
            Console.WriteLine(string.Format("{0}.{1} Method. The Result Is:{2}", 
                eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, eventArgs.ReturnValue.ToString()));
        }

        //方法发生异常时记录异常信息--这里可截获我要的方法异常信息
        public override void OnException(MethodExecutionArgs eventArgs)
        {
            Console.WriteLine(string.Format("{0}.{1} Method. The Exception Is:{2}",
                eventArgs.Method.DeclaringType.FullName, eventArgs.Method.Name, eventArgs.Exception.Message));
            
        }
    }
 
项目中我们的使用方式,通常只需要捕捉方法的异常信息就行
 static void Main(string[] args)
        {
            Add(3, 5);
            Console.WriteLine("-------------------------------------------------------");
            Subject(5, 12);
            Subject22(4, 0);
            Console.ReadLine(); 
        }

        //此函数让我们看其输入参数和返回值的日志记录
        [Logs]
        [Exception]
        public static int Add(int a, int b)
        {
            return a + b;   
        }

        //此函数看我们的异常通过自定义Exception特性记录下来
        [Logs]
        [Exception]
        public static int Subject(int a, int b)
        {

            throw new ArgumentException("减法出现异常,需要处理");
           
            return a - b;
        }
	//此函数获取方法的异常信息---通常我们用这个就可以了。
        [Exception]
        public static int Subject22(int a, int b)
        {

            throw new ArgumentException("尝试除以0");

            return a/b;
        }
 
        项目中我们使用种方式就足够了,只需要贴在方法上的特性能捕捉到异常并做处理就OK了。
	//此函数获取方法的异常信息---通常我们用这个就可以了。
        [Exception]
        public static int Subject22(int a, int b)
        {

            throw new ArgumentException("尝试除以0");

            return a/b;
        }
 
本文来自:http://www.cnblogs.com/chengxingliang/archive/2011/11/21/2248436.html
感谢这位兄弟付出。测试源码

转载于:https://www.cnblogs.com/ChiYue/p/3447328.html

C# 中,可以使用特性Attribute)来标记类、方法、属性等成员,以便在程序运行时通过反射获取这些特性的信息。 为方法标记特性注释,需要定义一个继承自 `System.Attribute` 类的特性类,并将它应用到方法上。比如: ```csharp [AttributeUsage(AttributeTargets.Method)] public class MyAttribute : Attribute { public string Description { get; set; } } public class MyClass { [MyAttribute(Description = "This is a method.")] public void MyMethod() { // 方法体 } } ``` 上述代码定义了一个名为 `MyAttribute` 的特性类,并将它应用到 `MyMethod` 方法上。`MyAttribute` 特性类有一个名为 `Description` 的属性,表示方法的描述信息。 在拦截器中获取方法特性注释,可以通过反射获取方法特性信息。比如: ```csharp public class MyInterceptor : IInterceptor { public void Intercept(IInvocation invocation) { var method = invocation.Method; var attributes = method.GetCustomAttributes(typeof(MyAttribute), true); if (attributes.Length > 0) { var myAttribute = (MyAttribute)attributes[0]; var description = myAttribute.Description; // 对方法进行拦截处理 } else { // 对方法进行拦截处理 } } } ``` 上述代码中,`MyInterceptor` 是一个实现了 `Castle.DynamicProxy.IInterceptor` 接口的拦截器类。在拦截方法时,通过 `invocation.Method` 获取当前方法的 `MethodInfo` 对象,然后通过 `GetCustomAttributes` 方法获取该方法上的所有 `MyAttribute` 特性。如果存在 `MyAttribute` 特性,就从中获取 `Description` 属性的值,进行相应的拦截处理。如果不存在该特性,也可以进行默认的拦截处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值