winform 记录全局异常捕获

时间:2022-05-26 05:58:39

/// <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> </param> ///<param> </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("系统出现未知异常,请重启系统!"); }