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

在做一些应用中,根据实际的需求情况,网上也收了些资料。这个对查找程序中的bug及出现的一些问题能很好排查,找到问题原因!自己记录下
 static class Program
    {
        /// 
        /// The main entry point for the application.
        /// 
        [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 捕捉全局异常代码
        /// 
        /// 
        /// 
        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
    {


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


        /// 
        /// 写error级别日志
        /// 
        /// 异常信息
        /// 异常类
        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);
        }

        /// 
        /// 写日志
        /// 
        /// 日志信息    
        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"));


            }
        }
    }

你可能感兴趣的:(C#学习记录)