#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 вам нужна дополнительная помощь с этим вопросом? 🙂