繁体   English   中英

如何围绕MefBootstrapper InitializeModules实现异常处理?

[英]How to implement exception handling around MefBootstrapper InitializeModules?

我有一些棱镜工作。 特别是,一个调用InitializeModules的引导程序(MefBootstrapper)。 在其中一个模块中,引发了一个异常,当我重新抛出该异常时,我得到了未处理的异常。

未成功,我向异常事件添加了委托方法,例如:

AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
System.Windows.Application.Current.DispatcherUnhandledException += CurrentOnDispatcherUnhandledException;

首先,您需要将异常标记为AppDomain.CurrentDomain.UnhandledException附带的事件处理程序中处理的异常,以防止应用程序崩溃:

Application.Current.Dispatcher.UnhandledException += (sender, e) => e.Handled = true;

其次,在给定的棱镜模块初始化期间引发的异常会阻止其他模块的加载。 为了避免这种情况,您可以将ModuleManager子类如下:

public class ErrorHandlingModuleManager : ModuleManager
{
    public ErrorHandlingModuleManager(IModuleInitializer moduleInitializer, IModuleCatalog moduleCatalog, ILoggerFacade loggerFacade) : base(moduleInitializer, moduleCatalog, loggerFacade)
    {
    }

    protected override void LoadModulesThatAreReadyForLoad()
    {
        var initializationExceptions = new List<Exception>();

        while (true)
        {
            try
            {
                base.LoadModulesThatAreReadyForLoad();

                break;
            }
            catch (ModuleInitializeException e)
            {
                initializationExceptions.Add(e);
            }
            catch (Exception e)
            {
                initializationExceptions.Add(e);

                break;
            }
        }

        if (initializationExceptions.Any())
            throw new AggregateException(initializationExceptions);
    }
}

}

确保在您的Mef容器中注册ErrorHandlingModuleManager以覆盖默认值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM