企业库异常处理“过程”方法

时间:2013-01-13 12:39:11

标签: database logging exception-handling enterprise-library fluent-interface

我对使用企业库异常处理应用程序块有疑问。

首先是“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块?

1 个答案:

答案 0 :(得分:2)

您需要配置日志记录块。您没有发布您获得的异常,但如果您检查InnerException属性,您将找到消息:

  

LogWriter类型没有可访问的构造函数。

要使用异常处理块登录数据库,您需要配置异常处理块,日志记录块和数据访问块。在你的情况下,它看起来像这样:

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<>,因为您正在吞下异常,而不是抛弃或重新抛出。