使用属性处理异常

时间:2014-01-31 16:18:14

标签: c# exception-handling

可以请某人以非常简单/简单的方式解释如何通过属性处理异常吗?

例如,如果我有这样的简单代码:

class Test{
static void Main(string[] args){
    try {
            Console.WriteLine("div= "+ Division(0));
        }
        catch (DivideByZeroException e)
        {
            Console.WriteLine("Attempted divide by zero -->" + e.Message);
        }

        Console.ReadLine();   
    }

    public static int Division(int i){  return 10 / i; }
}

如何使用属性更改此代码?

1 个答案:

答案 0 :(得分:3)

开箱即用的.NET无法做到这一点。

tl; dr - 没有“通过属性处理异常的非常简单/简单的方式(...)”


您正在尝试以AOP方式处理异常(面向方面​​编程),例如,使用属性方面附加到方法 -

PostSharp允许您这样做:

没有postharp:

public class OrderFulfillmentService  
{ 
    public void Fulfill( Order order )  
    { 
       try  
       { 
          // Do stuff.   
       }  
       catch ( Exception e ) 
       { 
            if ( ExceptionHandler.Handle(e) ) 
                throw; 
       }  
    }  
} 

使用postharp:

public class OrderFulfillmentService  
{ 
    [HandleException]  
    public void Fulfill( Order order )  
    { 
        // Do stuff. 
    } 
}

请注意使用AOP的缺点:代码可能变得不那么可读(因为它不是按顺序编写的)而且可维护性较差。


您也可以使用Castle Interceptor/DynamicProxy

,而不是使用属性

您需要创建一个包围对象的拦截器并拦截对它的调用。在运行时,Castle将使此拦截器扩展您的具体类或实现一个通用接口 - 这意味着您将能够将拦截器注入任何针对截获的类的代码片段。您的代码看起来像这样:

public class Interceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
       try{
            invocation.Proceed();
        } catch(Exception ex) {
           //add your "post execution" calls on the invocation's target
        }
    }
}

使用Castle进行AOP简介:http://docs.castleproject.org/Windsor.Introduction-to-AOP-With-Castle.ashx