【问题标题】:Enterprise Library Exception Handling "Process" method企业库异常处理“处理”方法
【发布时间】:2012-12-27 12:47:16
【问题描述】:

我有一个关于使用企业库异常处理应用程序块的问题。

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

【问题讨论】:

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


    【解决方案1】:

    您需要配置日志记录块。您没有发布您得到的异常,但如果您检查 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&lt;&gt;,因为您正在吞噬异常而不是抛出或重新抛出。

    【讨论】:

      猜你喜欢
      • 2011-02-27
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2011-02-19
      相关资源
      最近更新 更多