0

EnterpriseLibraryの例外処理アプリケーションブロックの使用について質問があります。

1つ目は「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ブロックに含める必要があります。

中断やtry-catchブロックなしで例外を処理する「Process」メソッドを使用するにはどうすればよいですか?

4

1 に答える 1

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<>また、例外を飲み込み、スローまたは再スローしないため、構成には必要ないことに注意してください。

于 2013-01-15T01:22:53.810 に答える