WPF 异常处理

思路

较好的两种处理方式
1、在发生异常这一级处理
2、当很多地方出现相同的异常,统一抛到App级中,用统一的方法处理(自己写一个异常类)

全局异常处理

在App里面,处理异常,并标记为“已处理”

public App()
{
    //wpf 程序异常捕获,而不崩溃退出
    DispatcherUnhandledException += App_DispatcherUnhandledException;
    TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
    e.SetObserved();
    ExceptionHandler(e.Exception.InnerException);
}

private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    e.Handled = true;
    ExceptionHandler(e.Exception);
}

private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    ExceptionHandler((Exception)e.ExceptionObject);
}

private void ExceptionHandler(Exception ex)
{
    Dispatcher.Invoke(() =>
    {
#if DEBUG
        MessageBox.Show(string.Format("调用堆栈:\n{0}\n\n\n异常信息:\n{1}", ex.StackTrace, ex.Message));
#else
        MessageBox.Show(string.Format("异常信息:\n{0}",  ex.Message));
#endif  
    });

    RecordException(ex,true);
}

private static void RecordException(Exception ex, bool isTop)
{
    //这里可以用任意记录日志的工具
    var logger = LogTool.GetFileLogger($"异常日志");
    logger.Info($"Message:{ex.Message}");
    logger.Info($"ToString:{ex.ToString()}");
    logger.Info($"Source:{ex.Source}");
    logger.Info($"StackTrace:{ex.StackTrace}");
    if (ex.InnerException != null)
    {
        RecordException(ex.InnerException, false);
    }
    if (isTop)
    {
        logger.Info("\n");
        logger.Info("\n");
    }
}
posted @ 2017-12-31 18:27  Lulus  阅读(550)  评论(0编辑  收藏  举报