C# WinForm捕获全局异常

  • A+
所属分类:.NET技术
摘要

根据网上的资料稍微修改了一下,原理很简单,代码如下:

根据网上的资料稍微修改了一下,原理很简单,代码如下:

using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Text;  namespace WindowsFormsApplication2 {     static class Program     {         /// <summary>         /// 应用程序的主入口点。         /// </summary>         [STAThread]         static void Main()         {             GlobalExceptionCapture(() =>              {                 Application.EnableVisualStyles();                 Application.SetCompatibleTextRenderingDefault(false);                 Application.Run(new Form1());             });                     }          static void GlobalExceptionCapture(Action mainContent)          {             try             {                 //设置应用程序处理异常方式:ThreadException处理                 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);                 //处理UI线程异常                 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);                 //处理非UI线程异常                 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);                  #region 应用程序Main()内容包装的委托                 mainContent();                 #endregion             }             catch (Exception ex)             {                 string str = GetExceptionMsg(ex, string.Empty);                 MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);             }         }          static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)         {             string str = GetExceptionMsg(e.Exception, e.ToString());             MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);             //Log.Write(str);         }          static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)         {             string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());             MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);             //Log.Write(str);         }          /// <summary>         /// 生成自定义异常消息         /// </summary>         /// <param name="ex">异常对象</param>         /// <param name="backStr">备用异常消息:当ex为null时有效</param>         /// <returns>异常字符串文本</returns>         static string GetExceptionMsg(Exception ex, string backStr)         {             StringBuilder sbr = new StringBuilder();             sbr.AppendLine("****************************异常文本****************************");             sbr.AppendLine("【出现时间】:" + DateTime.Now.ToString());             if (ex != null)             {                 sbr.AppendLine("【异常类型】:" + ex.GetType().Name);                 sbr.AppendLine("【异常信息】:" + ex.Message);                 sbr.AppendLine("【堆栈调用】:" + ex.StackTrace);                 sbr.AppendLine("【异常对象】:" + ex.Source);                 sbr.AppendLine("【触发方法】:" + ex.TargetSite);             }             else             {                 sbr.AppendLine("【未处理异常】:" + backStr);             }             sbr.AppendLine("***************************************************************");             return sbr.ToString();         }     }   }