Как реализовать обработку исключений вокруг MefBootstrapper InitializeModules? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть работа с Призмой.В частности, загрузчик (MefBootstrapper), который вызывает InitializeModules.Во время одного из модулей возникает исключение, когда я перебрасываю его, я получаю исключение необработанным.

Неудачно, я добавил методы делегата к событиям исключения, как:

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

1 Ответ

0 голосов
/ 28 февраля 2019

Во-первых, вам нужно пометить исключение как обработанное в обработчике событий, прикрепленном к AppDomain.CurrentDomain.UnhandledException, чтобы предотвратить сбой приложения:

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

Во-вторых, исключение выдается во время данного модуля Prismинициализация может остановить загрузку других модулей.Чтобы обойти это, вы можете создать подкласс 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);
    }
}

}

Обязательно зарегистрируйте ErrorHandlingModuleManager в контейнере Mef, чтобы переопределить значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...