WPF-Caliburn.Микро-журнал обрабатывает исключение в домене приложения

#wpf #exception-handling #appdomain #nlog #caliburn.micro

#wpf #исключение #appdomain #nlog #caliburn.micro

Вопрос:

Привет, я пытаюсь зарегистрировать ожидание в домене приложения с помощью NLog. Это приложение WPF с Caliburn Micro.

В загрузчике MEF у меня есть этот код:

 static readonly ILog Log = LogManager.GetLog(typeof(NLogLogger));

#region Constructors

    public MefBootStrapper()
        : base()
    {
        _msgBox = new MessageBoxes();
        _doHandle = true;
    }

    static MefBootStrapper()
    {
        LogManager.GetLog = type => new NLogLogger(type);
    }


#endregion


#region Exception handling on App Domain

protected override void OnUnhandledException(object sender, 
    System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    if (_doHandle)
    {
        Log.Error(e.Exception.InnerException);
        _msgBox.ShowException(e.Exception.InnerException);
        e.Handled = true;
    }
    else
    {
        Log.Error(e.Exception.InnerException);
        _msgBox.ShowException(e.Exception);
        e.Handled = false;
    }

}

#endregion
  

Когда я запускаю приложение и создаю исключение из класса view modle, отображается окно сообщения, которое в порядке, но исключение не записывается в файл.

Я пытаюсь зарегистрировать исключение в вызовах модели просмотра:

что-то вроде этого: Log.Error(новое исключение («4»));

Это работает, но если я попытаюсь зарегистрировать исключение в методе OnUnhandleException, оно не сработает. Почему?

Ответ №1:

Ваша проблема в том, что статическое поле Log инициализируется до запуска вашего статического конструктора см. (инициализация статического поля). Таким образом, вместо вашего NLogLogger будет инициализировано ваше Log поле с нулевым параметром Caliburn по умолчанию. Вы должны переместить инициализацию поля журнала в свой статический конструктор.

 private static readonly ILog Log;

static MefBootStrapper()
{
    LogManager.GetLog = type => new NLogLogger(type);
    Log = LogManager.GetLog(typeof(NLogLogger));
}
  

Комментарии:

1. @John вам нужна дополнительная помощь с этим вопросом? 🙂