【问题标题】:How To Use Exception Manager Enterprise Library 6.0如何使用异常管理器企业库 6.0
【发布时间】:2013-06-16 07:42:45
【问题描述】:

使用Enterprise Library 6.0时,以下代码出现此错误:

bool rethrow = ExceptionPolicy.HandleException(ex, "ReplacePolicy1")

“必须使用 SetExceptionManager 方法在 ExceptionPolicy 类中设置一个 ExceptionManager。”

在 Enterprise Library 5.0 中,此代码有效:

public static bool HandleException(Exception exception, string PolicyName)
{
    ExceptionManager exManager = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();
    ExceptionPolicy.SetExceptionManager(exManager);
    bool rethrow = ExceptionPolicy.HandleException(ex, "ReplacePolicy1");
    return reThrow;
}

但在 Enterprise Library 6.0 中找不到 EnterpriseLibraryContainer 类。 我想要获取 ExceptionManager 的实例。 我该如何解决这个问题?

【问题讨论】:

  • “大多数(如果不是全部)企业库类不再维护” - 我不是 EntLib 的粉丝,但我认为这种说法并不准确 - 请参阅 msdn.microsoft.com/en-us/library/ff648951.aspx
  • Enterprise Library 团队在新的 Enterprise Library 6 中弃用了缓存、加密和安全块。他们这样做是因为他们认为 .NET Framework 现在支持许多开箱即用的相同功能。他们确实添加了一些新块,包括语义记录(非常方便)。 Enterprise Library 在 entlib.codeplex.com 上作为开源维护,并且绝对不会退役。

标签: c# exception-handling enterprise-library


【解决方案1】:

EnterpriseLibraryContainer 因 Enterprise Library 6 的发布而被删除。EnterpriseLibraryContainer 有一种新方法可用于引导 Enterprise Library 6 中的应用程序块。如果您想获得 ExceptionManager 的实例,您可以使用工厂:

IConfigurationSource config = ConfigurationSourceFactory.Create();
ExceptionPolicyFactory factory = new ExceptionPolicyFactory(config);

ExceptionManager exManager = factory.CreateManager();

要将块配置为使用静态外观,您可以使用 SetExceptionManager 方法并从上面提供 ExceptionManager:

ExceptionPolicy.SetExceptionManager(factory.CreateManager());

这只需要在应用程序启动时执行一次。

【讨论】:

  • 我复制了这段代码,但是当 factory.CreateManager() 执行时,我在第 3 行遇到异常。异常消息是:“必须使用 SetExceptionManager 方法在 ExceptionPolicy 类中设置一个 ExceptionManager。”关于如何解决这个问题的任何想法?
  • 只有在调用ExceptionPolicy.HandleException 时才会抛出该消息。如果您使用的是静态外观,那么您需要在应用程序启动时(或在执行异常处理代码之前的某个时间)调用一次ExceptionPolicy.SetExceptionManager(factory.CreateManager());。如果您仍然遇到问题,那么最好发布一个新问题,其中包含您的问题的具体情况(代码、配置等)。
  • 感谢您的回复。我刚刚通过实验发现这只是 WCF 服务库中的一个问题。当我将代码移动到 HTTP 托管项目时,问题就消失了。唯一的缺点是直接在库上使用 WcfSvhHost.exe 进行调试时,我没有使用 WCF 异常屏蔽。没什么大不了的。
  • 需要这些命名空间:使用 Microsoft.Practices.EnterpriseLibrary.Common.Configuration;使用 Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
  • 要使用上面代码中设置的ExceptionManager,使用ExceptionPolicy.HandleException()
【解决方案2】:

我也遇到过这个问题,现在我已经解决了。所以,你也可以尝试在Global.asax文件的Application_Start()中设置如下代码:

IConfigurationSource configurationSource = ConfigurationSourceFactory.Create();
DatabaseFactory.SetDatabaseProviderFactory(new DatabaseProviderFactory());
if (configurationSource.GetSection(LoggingSettings.SectionName) != null)
Logger.SetLogWriter(new LogWriterFactory(configurationSource).Create());
ExceptionPolicy.SetExceptionManager(new ExceptionPolicyFactory(configurationSource).CreateManager());

【讨论】:

  • 需要这些名称空间:使用 Microsoft.Practices.EnterpriseLibrary.Common.Configuration;使用 Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;使用 Microsoft.Practices.EnterpriseLibrary.Logging;
【解决方案3】:

如果您想在布尔变量中获取 HandleException,您必须只访问 ExceptionManager。

exManager.HandleException(ex, "ReplacePolicy1");

这是完整的示例:

public static bool HandleException(Exception exception, string PolicyName)
{
    IConfigurationSource config = ConfigurationSourceFactory.Create();
    ExceptionPolicyFactory factory = new ExceptionPolicyFactory(config);
    ExceptionManager exManager = factory.CreateManager();
    ExceptionPolicy.SetExceptionManager(factory.CreateManager());               
    bool rethrow  = exManager.HandleException(ex, "ReplacePolicy1");  
    return rethrow;
}

【讨论】:

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