0

我有使用企業庫異常處理應用程序塊的問題。企業庫異常處理「處理」方法

首先是「ExceptionManager.Process」方法。我從文檔中理解的是,您可以執行所需的方法,並且如果它有異常,ExceptionManager將處理它,並且它不需要任何try-catch塊。但是當我使用它時會拋出異常。

builder.ConfigureExceptionHandling() 
       .GivenPolicyWithName("Data Access Policy") 
       .ForExceptionType<Exception>() 
       .LogToCategory("General") 
       .WithSeverity(System.Diagnostics.TraceEventType.Error) 
       .UsingEventId(9000) 
       .WrapWith<InvalidOperationException>() 
       .UsingMessage("MyMessage").ThenDoNothing(); 
     #endregion 

     var configSource = new DictionaryConfigurationSource(); 
     builder.UpdateConfigurationWithReplace(configSource); 
     EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource); 

     #endregion 

     var exManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>(); 
     exManager.Process(GenerateException, "Data Access Policy"); 
    } 

    private static void GenerateException() 
    { 
     throw new NullReferenceException(); 
    } 

我已經使用fluent-API來配置應用程序塊。我想將異常記錄到數據庫,並且配置得很好。 ExeptionManager.HandleException運行良好,但它需要位於try-catch塊中。

我該如何使用「Process」方法處理異常而不會中斷並且沒有try-catch塊?

回答

2

您需要配置日誌塊。你沒有張貼你都拿到了異常,但如果你檢查InnerException屬性,你會發現消息:

類型日誌寫不具有可訪問的構造函數。

要使用異常處理塊,你將需要配置異常處理塊,記錄塊和數據訪問塊登錄到數據庫。在你的情況下,它會是這個樣子:

var builder = new ConfigurationSourceBuilder(); 

builder.ConfigureExceptionHandling() 
    .GivenPolicyWithName("Data Access Policy") 
    .ForExceptionType<Exception>() 
    .LogToCategory("General") 
    .WithSeverity(System.Diagnostics.TraceEventType.Error) 
    .UsingEventId(9000) 
    .WrapWith<InvalidOperationException>() 
    .UsingMessage("MyMessage").ThenDoNothing(); 

builder.ConfigureLogging() 
    .WithOptions 
     .DoNotRevertImpersonation() 
    .LogToCategoryNamed("General") 
     .WithOptions.SetAsDefaultCategory() 
     .SendTo.Database("Database Trace Listener") 
     .UseDatabase("Logging") 
     .WithAddCategoryStoredProcedure("AddCategory") 
     .WithWriteLogStoredProcedure("WriteLog"); 

builder.ConfigureData() 
    .ForDatabaseNamed("Logging") 
    .ThatIs.ASqlDatabase() 
    .WithConnectionString(@"Data Source=.\SQLEXPRESS;DataBase=LoggingDefault;Integrated Security=True;") 
    .AsDefault(); 

var configSource = new DictionaryConfigurationSource(); 
builder.UpdateConfigurationWithReplace(configSource); 
EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource); 


var exManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>(); 
exManager.Process(GenerateException, "Data Access Policy"); 

另外請注意,因爲你是吞嚥異常,不亂扔或重新拋出你不需要Wrap<>在配置中。