C#程序全局监听报错事件并写入log

该代码示例展示了如何在C#中设置全局异常监听,包括UI线程和非UI线程的异常处理。当发生未处理的异常时,程序会捕获异常信息,如异常类型、消息和堆栈跟踪,并将这些信息写入日志文件,确保错误能够被记录和分析。

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

 Main函数添加监听

static void Main()
        {
            #region 监听全局异常输出
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            //处理UI线程异常   
            Application.ThreadException += Application_ThreadException;
            //添加非UI上的异常.
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            #endregion
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form());
        }

 监听函数事件处理


        #region 全局监听报错事件并写入log
        /// <summary>
        ///错误弹窗
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            string str;
            var strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now + "\r\n";
            var error = e.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);
            }

            LogErroWrite(str);
        }

        /// <summary>
        /// 非ui线程报错
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                Exception ex = (Exception)e.ExceptionObject;
                string errStr = "出现非ui线程的异常: " + DateTime.Now + "\r\n" + ex.Message + "\n\nStack Trace:\n" + ex.StackTrace;
                LogErroWrite(errStr);
            }
            catch (Exception ex)
            {
                try
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    Application.Exit();
                }
            }
        }

        /// <summary>
        /// 将错误日志写入到文件
        /// </summary>
        /// <param name="str"></param>
        public static void LogErroWrite(string str)
        {

            string basePath = Application.StartupPath + @"\Log";
            if (!Directory.Exists(basePath))
            {
                Directory.CreateDirectory(basePath);
            }
            string fileName = DateTime.Now.ToString("yyyy-MM-dd") + "_ErrLog.txt";
            fileName = Path.Combine(basePath, fileName);
            using (var sw = new StreamWriter(fileName, true))
            {
                sw.WriteLine("---------------------------------------------------------");
                sw.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
                sw.WriteLine(str);
                sw.WriteLine("---------------------------------------------------------");
                sw.WriteLine("");
                sw.Close();
            }
        }
        #endregion

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值