Как проглотить исключение по IInterceptionBehavior? - PullRequest
4 голосов
/ 07 ноября 2011

У меня есть удар, похожий на IInterceptionBehavior:

public class TraceBehavior : IInterceptionBehavior
{
    public IEnumerable<Type> GetRequiredInterfaces()
    {
        return Type.EmptyTypes;
    }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
    {
        Console.WriteLine(string.Format("Invoke method:{0}",input.MethodBase.ToString()));
        IMethodReturn result = getNext()(input, getNext);
        if (result.Exception == null)
        {
            Console.WriteLine("Invoke successful!");
        }
        else 
        {
            Console.WriteLine(string.Format("Invoke faild, error: {0}", result.Exception.Message));
            result.Exception = null;
        }
        return result;
    }

    public bool WillExecute { get { return true; } }
}

Независимо от того, ставлю я его на методы или нет, исключение выдает всегда.Кто-нибудь может мне помочь?

1 Ответ

4 голосов
/ 07 ноября 2011

Код выглядит нормально, но вы не показали, как регистрируется перехват и как вызывается объект.

Если предположить, что перехват вызывается, то, если бы я догадался, это вызвало бы то, что вызванный метод возвращает тип значения, а IMethodReturn.ReturnValue является нулевым, что вызывает NullReferenceException.

Если это так, то, возможно, возврат значения по умолчанию для типа значения решит вашу проблему:

public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
    Console.WriteLine(string.Format("Invoke method:{0}", input.MethodBase.ToString()));
    IMethodReturn result = getNext()(input, getNext);
    if (result.Exception == null)
    {
        Console.WriteLine("Invoke successful!");
    }
    else
    {
        Console.WriteLine(string.Format("Invoke faild, error: {0}", result.Exception.Message));
        result.Exception = null;

        Type type = ((MethodInfo)input.MethodBase).ReturnType;

        if (type.IsValueType)
        {
            result.ReturnValue = Activator.CreateInstance(type);
        }
    }
    return result;
}
...