WPF-Caliburn.Micro-NLog在App Domain上处理异常

时间:2011-10-15 10:49:49

标签: wpf exception-handling appdomain nlog caliburn.micro

您好我尝试使用NLog在App Domain上进行log expcetion。它是Caliburn Micro的WPF应用程序。

在MEF bootstraper中我有这段代码:

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

当我运行app并从视图模块类中抛出异常时,它会显示消息框,但是异常不会记录到文件中。

我在视图模型调用中尝试记录异常:

类似这样的东西:Log.Error(new Exception(“4”));

这项工作,但是如果我在OnUnhandleException方法中尝试记录异常,它就不会发生故障。为什么呢?

1 个答案:

答案 0 :(得分:0)

您的问题是静态字段Log在静态构造函数运行之前被初始化(Static field initialization)。因此,您的Log字段将使用默认的Caliburn Nulloger初始化而非您的NLogLogger。您应该将Log字段初始化移动到静态构造函数中。

private static readonly ILog Log;

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