Winform 主程序入口中记录并捕获全局异常

本文深入探讨了在程序开发中如何有效处理未捕获的异常,包括全局异常捕获策略、线程异常处理以及非UI线程异常处理。同时,介绍了日志记录的重要性,并详细阐述了日志帮助类的设计与实现,旨在提高应用的稳定性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做一些应用中,根据实际的需求情况,网上也收了些资料。这个对查找程序中的bug及出现的一些问题能很好排查,找到问题原因!自己记录下
 static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {

            LogHepler log = new LogHepler();

            try
            {
             //处理未捕获的异常
             Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
             //处理UI线程异常
             Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
             //处理非UI线程异常
             AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);


            #region Program.cs自动生成的代码
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            CultureInfo ci = new CultureInfo("zh-hans");
            Application.CurrentCulture = ci;

            DevExpress.UserSkins.BonusSkins.Register();
            DevExpress.Skins.SkinManager.EnableMdiFormSkins();
            UserLookAndFeel.Default.SetSkinStyle(Properties.Settings.Default.Theme);
            DevExpress.Skins.SkinManager.EnableFormSkins();

            DialogResult result = DialogResult.None;
            using (frmLogin fl = new frmLogin())
            {
                result = fl.ShowDialog();
                if (result == DialogResult.OK)
                {

                    SplashScreenManager.ShowForm(null, typeof(frmSplash), true, true, false, 1000);
                    for (int i = 1; i <= 100; i++)
                    {
                        SplashScreenManager.Default.SendCommand(frmSplash.SplashScreenCommand.SetProgress, i);
                        Thread.Sleep(30);
                    }
                    SplashScreenManager.CloseForm(false);
                    Application.Run(new MainForm());
                }
                else
                {
                    Application.Exit();
                }
            }

            #endregion 
            }
            catch (Exception ex)
            {
                string str = "";
                string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";

                if (ex != null)
                {
                    str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",
                    ex.GetType().Name, ex.Message, ex.StackTrace);
                }
                else
                {
                    str = string.Format("应用程序线程错误:{0}", ex);
                }

                MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                log.WriteLog(str);
            }

        }

        #region 捕捉全局异常代码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            LogHepler log = new LogHepler();
            string str = "";
            string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
            Exception error = e.Exception as Exception;
            if (error != null)
            {
                str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",
                error.GetType().Name, error.Message, error.StackTrace);
            }
            else
            {
                str = string.Format("应用程序线程错误:{0}", e);
            }
            DevExpress.XtraEditors.XtraMessageBox.Show(UserLookAndFeel.Default, error.Message, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

            //MessageBox.Show(error.Message, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

            log.WriteLog(str);
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            LogHepler log = new LogHepler();
            string str = "";
            Exception error = e.ExceptionObject as Exception;
            string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
            if (error != null)
            {
                str = string.Format(strDateInfo + "Application UnhandledException:{0};\n\r堆栈信息:{1}", error.Message, error.StackTrace);
            }
            else
            {
                str = string.Format("Application UnhandledError:{0}", e);
            }

            MessageBox.Show(error.Message, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

            log.WriteLog(str);
        }
       
        #endregion

    }
日志帮助类
public  class LogHepler
    {


        /// <summary>
        /// 锁对象
        /// </summary>
        private static object lockHelper = new object();


        /// <summary>
        /// 写error级别日志
        /// </summary>
        /// <param name="errorMessage">异常信息</param>
        /// <param name="ex">异常类</param>
        public void WriteErrorLog(string errorMessage, Exception ex)
        {
            string errorMsg = string.Empty;
            if (ex.InnerException != null)
            {
                errorMsg = ex.InnerException.Message;
            }
            errorMsg = errorMsg + errorMessage + ex.StackTrace;
            WriteLog(errorMsg);
        }

        /// <summary>
        /// 写日志
        /// </summary>
        /// <param name="msg">日志信息</param>    
        public void WriteLog(string msg)
        {
            lock (lockHelper)
            {
                string FilePath = string.Empty;
                string AbsolutePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "Log";
                if (!Directory.Exists(AbsolutePath))
                {
                    Directory.CreateDirectory(AbsolutePath);
                }
                FilePath = AbsolutePath + "\\" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                File.AppendAllText(FilePath, "\r\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n" + msg, Encoding.GetEncoding("gb2312"));


            }
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值