Почему перехват Unity не может поймать Exception?

У меня возникла проблема с перехватом Unity при создании исключения в моем методе. Пожалуйста, ссылку из моего примера приложения, как показано ниже:

class Program
{
    static void Main(string[] args)
    {
        var container = new UnityContainer();
        container.RegisterType<IInterface1, Implementation1>();

        container.RegisterType<ICallHandler, AuditLoggingCallHandler>();

        container.RegisterInstance(typeof(IUnityContainer), container);
        container.AddNewExtension<Interception>();

        container.Configure<Interception>()
            .SetInterceptorFor<IInterface1>(new InterfaceInterceptor());

        var service = container.Resolve<IInterface1>();

        service.Method1("xyz");

        Console.ReadLine();
    }
}

Поведение AuditLogging реализует следующий код ниже:

public class AuditLoggingAttribute : HandlerAttribute
{
    public int RequestId { get; set; }

    public override ICallHandler CreateHandler(IUnityContainer container)
    {
        return container.Resolve<ICallHandler>();
    }
}

public class AuditLoggingCallHandler : ICallHandler
{
    public IMethodReturn Invoke(IMethodInvocation input, 
    GetNextHandlerDelegate getNext)
    {
        LogEntry logEntry = new LogEntry();
        logEntry.Message = "[BEGIN] " + input.MethodBase.Name + "()";
        Logger.Write(logEntry);

        IMethodReturn result = getNext()(input, getNext);

        if (result.Exception != null)
        {
            logEntry = new LogEntry();
            logEntry.Message = " [EXCEPTION] " + input.MethodBase.Name 
             + "." + input.MethodBase.Name 
             + "() ";

            logEntry.ExtendedProperties
            .Add("Exception Message", result.Exception.Message);
            logEntry.ExtendedProperties
            .Add("Exception StackTrace", result.Exception.StackTrace);
            Logger.Write(logEntry);
        }

        logEntry = new LogEntry();
        logEntry.Message = " [FINISH] " + input.MethodBase.Name + "()";

        if (result.ReturnValue != null)
        {
            logEntry
            .ExtendedProperties
            .Add("Return value", result.ReturnValue.ToString());
        }

        Logger.Write(logEntry);

        return result;
    }

    public int Order { get; set; }
}

И Interface1.cs и Practice1.cs находятся ниже:

public interface IInterface1
{
    [AuditLogging]
    IEnumerable<string> Method1(string name);
}

public class Implementation1 : IInterface1
{
    public IEnumerable<string> Method1(string name)
    {
        if (name.Equals("xyz"))
        {
            throw new Exception("xyz are not allow");
        }

        yield return "ABC";
    }
}

Файл журнала указывает, что Исключение не записывается. Есть кое-что, что я пропускаю, или перехват Unity не может работать должным образом. Вот файл журнала ниже, он должен иметь [EXCEPTION] но ничего такого нет

----------------------------------------
Timestamp: 5/30/2013 9:29:07 AM

Message: [BEGIN] Method1()

Category: General

Priority: -1

EventId: 0

Severity: Information

Title:

Machine: XXXY

App Domain: ConsoleApplication10.vshost.exe

ProcessId: 8228

Thread Name: 

Win32 ThreadId:1280

Extended Properties: Parameter values - [(String) name =  'xyz']

----------------------------------------

Кстати, я использовал Enterprise Library версии 5 и Unity версии 2.0.

1 ответ

Решение

Проблема здесь yield return "ABC", Когда мы подаем заявку yield return метод будет выполняться в ленивом режиме, поэтому Exception до сих пор не поднят. exception только поднять после MethodReturn возврат перехватчиком. Вы измените код, как показано ниже [EXCEPTION] войдет в файл:

    public IEnumerable<string> Method1(string name)
    {
        if (name.Equals("xyz"))
        {
            throw new Exception("xyz are not allow");
        }

        var list = new List<string>();
        list.Add("ABC");
        return list;

        //yield return "ABC";
    }

Надеюсь, это поможет.

Другие вопросы по тегам