简体   繁体   中英

How to implement exception handling around MefBootstrapper InitializeModules?

I have some Prism work. Specifically, a bootstrapper (MefBootstrapper) that calls InitializeModules. During one of the modules, an exception is raised, when I re-throw this, I get an exception unhandled.

Unsuccessfully, I have added delegate methods to the exception events, like:

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

First, you need to mark the exception as handled in the event handler attached to AppDomain.CurrentDomain.UnhandledException to keep the application from crashing:

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

Second, an exception thrown during a given Prism Module initialization can stop other Modules from loading. To circumvent this you can subclass ModuleManager as follows:

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);
    }
}

}

Be sure to register ErrorHandlingModuleManager with your Mef container to override the the default.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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