可以请某人以非常简单/简单的方式解释如何通过属性处理异常吗?
例如,如果我有这样的简单代码:
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; }
}
如何使用属性更改此代码?
答案 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