我对使用企业库异常处理应用程序块有疑问。
首先是“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块?
答案 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<>
,因为您正在吞下异常,而不是抛弃或重新抛出。