【问题标题】:WPF-Caliburn.Micro-NLog handle exception on App Domain应用程序域上的 WPF-Caliburn.Micro-NLog 处理异常
【发布时间】:2011-10-15 10:49:48
【问题描述】:

您好,我尝试使用 NLog 在 App Domain 上记录日志。它是带有 Caliburn Micro 的 WPF 应用程序。

在 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

当我运行应用程序并从视图模型类中抛出异常时,它显示的消息框正常,但异常未记录到文件中。

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

类似这样的:Log.Error(new Exception("4"));

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • @John 你在这个问题上需要更多帮助吗? :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2014-06-16
    • 2012-05-03
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    相关资源
    最近更新 更多