2013-05-30 50 views
3

在我的方法拋出一個異常時,我得到了與統一攔截的問題。請從我的樣本應用程序,如下參考:爲什麼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和Implementation1.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'] 

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

順便說一句,我使用的企業庫版本5和Unity 2.0版。

回答

2

的問題在這裏是yield return "ABC"。當我們將yield return的方法將在懶惰模式,所以Exception仍然沒有提出執行。該exceptionMethodReturn返回由攔截器後僅提高。你更改代碼,下面將看到[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"; 
    } 

希望這有助於。

+0

感謝。我發現你的幫助有根本原因,並理解爲什麼異常記錄不正確。 –