wpf 全局异常捕获处理

Posted fooo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wpf 全局异常捕获处理相关的知识,希望对你有一定的参考价值。

namespace WpfGridChange
{
    using System;
    using System.CodeDom.Compiler;
    using System.Diagnostics;
    using System.Windows;
    using System.Threading.Tasks;

    public class App : Application
    {
        [DebuggerNonUserCode, GeneratedCode("PresentationBuildTasks", "4.0.0.0")]
        public void InitializeComponent()
        {
             base.StartupUri = new Uri("../Resources/xaml/WinWellcome.xaml", UriKind.Relative);
           
        }

        protected override void OnStartup(StartupEventArgs e)
        {
            RegisterEvents();
            base.OnStartup(e);
        }

        /// <summary>
        /// 注册事件
        /// </summary>
        private void RegisterEvents()
        {
            //Task线程内未捕获异常处理事件
            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;

            //UI线程未捕获异常处理事件(UI主线程)
            this.DispatcherUnhandledException += App_DispatcherUnhandledException;

            //非UI线程未捕获异常处理事件(例如自己创建的一个子线程)
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        }

        private static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
        {
            try
            {
                var exception = e.Exception as Exception;
                if (exception != null)
                {
                    HandleException(exception);
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                e.SetObserved();
            }
        }

        //非UI线程未捕获异常处理事件(例如自己创建的一个子线程)      
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                var exception = e.ExceptionObject as Exception;
                if (exception != null)
                {
                    HandleException(exception);
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                //ignore
            }
        }

        //UI线程未捕获异常处理事件(UI主线程)
        private static void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            try
            {
                HandleException(e.Exception);
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                //处理完后,我们需要将Handler=true表示已此异常已处理过
                e.Handled = true;
            }
        }
        private static void HandleException(Exception e)
        {
            MessageBox.Show("程序异常:" + e.Source + "
@@" + Environment.NewLine + e.StackTrace + "
##" + Environment.NewLine + e.Message);

            //记录日志
            Utils.LogWrite(e);

        }


        [GeneratedCode("PresentationBuildTasks", "4.0.0.0"), DebuggerNonUserCode, STAThread]
        public static void Main()
{ App app
= new App(); app.InitializeComponent(); app.Run(); } } }

 

Utils.LogWrite
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO;
using System.Net;
using System.Threading;

namespace WpfGridChange
{
    public class Utils
    {

       
        //读写锁,当资源处于写入模式时,其他线程写入需要等待本次写入结束之后才能继续写入
        private static readonly ReaderWriterLockSlim LogWriteLock = new ReaderWriterLockSlim();
        public static void LogWrite(Exception ex)
        {
            if (!Directory.Exists("Log"))
            {
                Directory.CreateDirectory("Log");
            }
            var now = DateTime.Now;
            var logpath = @"Log" + now.Year + "" + now.Month + "" + now.Day + ".log";
            var log = "
----------------------" + DateTime.Now + " --------------------------
"
                      + ex.Message
                      + "
"
                      + ex.InnerException
                      + "
"
                      + ex.StackTrace
                      + "
----------------------footer--------------------------
";
            try
            {
                //设置读写锁为写入模式独占资源,其他写入请求需要等待本次写入结束之后才能继续写入
                LogWriteLock.EnterWriteLock();
                File.AppendAllText(logpath, log);
            }
            finally
            {
                //退出写入模式,释放资源占用
                LogWriteLock.ExitWriteLock();
            }
        }


    }
}

 

以上是关于wpf 全局异常捕获处理的主要内容,如果未能解决你的问题,请参考以下文章

wpf 全局异常捕获处理

WPF全局异常捕获

处理全局异常而不杀死应用程序?

WPF 捕捉全局异常

2022-03-17 WPF面试题 如何在WPF应用程序中全局捕获异常?

WPF 精修篇 全局为处理异常处理