winform 记录全局异常捕获

Posted zeroone

tags:

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

/// <summary>
        ///   应用程序的主入口点。
        /// </summary>
        public static ApplicationContext context;


        [STAThread]
        private static void Main()
        {
            try
            {
                //处理未捕获的异常   
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                //处理UI线程异常   
                Application.ThreadException += Application_ThreadException;
                //处理非UI线程异常   
                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

                var aProcessName = Process.GetCurrentProcess().ProcessName;
                if ((Process.GetProcessesByName(aProcessName)).GetUpperBound(0) > 0)
                {
                    MessageBox.Show(@"系统已经在运行中,如果要重新启动,请从进程中关闭...", @"系统警告", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }
                else
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);

                    var sp = new SplashForm(); //create splash screen
                    sp.Show(); //show splash screen
                    context = new ApplicationContext();
                    context.Tag = sp;
                    Application.Idle += Application_Idle; //注册程序运行空闲去执行主程序窗体相应初始化代码
                    Application.Run(context);
                }
            }
            catch (Exception ex)
            {
                LogHelper.Log(ex);
                MessageBox.Show("系统出现未知异常,请重启系统!");
            }
        }

        //初始化等待处理函数
        private static void Application_Idle(object sender, EventArgs e)
        {
            Application.Idle -= Application_Idle;
            if (context.MainForm == null)
            {
                var mw = new Login();
                //YYQTestForm mw = new YYQTestForm();

                context.MainForm = mw;
                var sp = (SplashForm) context.Tag;
                sp.Close(); //关闭启动窗体 
                mw.Show(); //启动主程序窗体
            }
        }


        ///<summary>
        ///  这就是我们要在发生未处理异常时处理的方法,我这是写出错详细信息到文本,如出错后弹出一个漂亮的出错提示窗体,给大家做个参考
        ///  做法很多,可以是把出错详细信息记录到文本、数据库,发送出错邮件到作者信箱或出错后重新初始化等等
        ///  这就是仁者见仁智者见智,大家自己做了。
        ///</summary>
        ///<param name="sender"> </param>
        ///<param name="e"> </param>
        private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
            var ex = e.Exception;
            if (ex != null)
            {
                LogHelper.Log(ex);
            }

            MessageBox.Show("系统出现未知异常,请重启系统!");
        }

        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            var ex = e.ExceptionObject as Exception;
            if (ex != null)
            {
                LogHelper.Log(ex);
            }

            MessageBox.Show("系统出现未知异常,请重启系统!");
        }

 

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

Android 捕获全局异常CrashHandler,防止异常闪退,记录异常日志

winform程序捕获全局异常,对错误信息写入日志并弹窗

winforms控制的全局异常处理

.net捕获全局异常并且记录日志多线程方式发送邮件提醒

WPF全局异常捕获

自定义全局异常捕获