zoukankan      html  css  js  c++  java
  • 【改进】C# WinForm捕获全局异常 SamWang

      许多小公司的项目都缺少异常处理模块,我们也是。经常会出现这种情况,用户在UI界面操作,就直接跳出堆栈调用的异常信息对话框,老板看到那叫一个火啊!你们的代码怎么天天出现乱码。呵呵!这就是没有异常捕获处理导致的,现在许多人写代码都没意识处理异常,只要实现功能就好,我的许多组员也是如此。

      项目刚接手,所以打算做一个异常全局捕获,统一处理的模式,采用具体详细信息的对话框提醒与日志文件保存方式。以下是根据网上找的C#winform全局异常捕获做了点修改。(等项目异常处理全部完成后,将心得体会做个记录,此处暂对全局异常捕获做个记录)  

     1     static class Program
     2     {
     3         /// <summary>
     4         /// 应用程序的主入口点。
     5         /// </summary>
     6         [STAThread]
     7         static void Main()
     8         {
     9             try
    10             {
    11                 //设置应用程序处理异常方式:ThreadException处理
    12                 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    13                 //处理UI线程异常
    14                 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    15                 //处理非UI线程异常
    16                 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    17 
    18                 #region 应用程序的主入口点
    19                 Application.EnableVisualStyles();
    20                 Application.SetCompatibleTextRenderingDefault(false);
    21                 Application.Run(new Form1());
    22                 #endregion
    23             }
    24             catch (Exception ex)
    25             {
    26                 string str = GetExceptionMsg(ex,string.Empty);
    27                 MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    28             }
    29         }
    30 
    31 
    32         static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    33         {
    34             string str = GetExceptionMsg(e.Exception, e.ToString());
    35             MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    36             //LogManager.WriteLog(str);
    37         }
    38 
    39         static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    40         {
    41             string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
    42             MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    43             //LogManager.WriteLog(str);
    44         }
    45 
    46         /// <summary>
    47         /// 生成自定义异常消息
    48         /// </summary>
    49         /// <param name="ex">异常对象</param>
    50         /// <param name="backStr">备用异常消息:当ex为null时有效</param>
    51         /// <returns>异常字符串文本</returns>
    52         static string GetExceptionMsg(Exception ex,string backStr)
    53         {
    54             StringBuilder sb = new StringBuilder();
    55             sb.AppendLine("****************************异常文本****************************");
    56             sb.AppendLine("【出现时间】:" + DateTime.Now.ToString());
    57             if (ex != null)
    58             {                
    59                 sb.AppendLine("【异常类型】:" + ex.GetType().Name);
    60                 sb.AppendLine("【异常信息】:" + ex.Message);
    61                 sb.AppendLine("【堆栈调用】:" + ex.StackTrace);
    62             }
    63             else
    64             {
    65                 sb.AppendLine("【未处理异常】:" + backStr);
    66             }
    67             sb.AppendLine("***************************************************************");
    68             return sb.ToString();
    69         }
    70     }

    参考:

    原代码
     1 static class Program
     2 {
     3     /// <summary>
     4     /// 应用程序的主入口点。
     5     /// </summary>
     6     [STAThread]
     7     static void Main()
     8     {
     9         try
    10         {
    11             //处理未捕获的异常
    12             Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
    13             //处理UI线程异常
    14             Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    15             //处理非UI线程异常
    16             AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    17 
    18             #region 应用程序的主入口点
    19 
    20             Application.EnableVisualStyles();
    21             Application.SetCompatibleTextRenderingDefault(false);
    22             Application.Run(new Main());
    23 
    24             #endregion
    25 
    26         }
    27         catch (Exception ex)
    28         {
    29             string str = "";
    30             string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
    31 
    32             if (ex != null)
    33             {
    34                 str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",
    35                 ex.GetType().Name, ex.Message, ex.StackTrace);
    36             }
    37             else
    38             {
    39                 str = string.Format("应用程序线程错误:{0}", ex);
    40             }
    41 
    42             //MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    43             LogManager.WriteLog(str); 
    44         }
    45 
    46     }
    47 
    48 
    49     static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    50     {
    51         string str = "";
    52         string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
    53         Exception error = e.Exception as Exception;
    54         if (error != null)
    55         {
    56             str = string.Format(strDateInfo + "异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",
    57             error.GetType().Name, error.Message, error.StackTrace);
    58         }
    59         else
    60         {
    61             str = string.Format("应用程序线程错误:{0}", e);
    62         }
    63 
    64         //MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    65         LogManager.WriteLog(str);
    66     }
    67 
    68     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    69     {
    70         string str = "";
    71         Exception error = e.ExceptionObject as Exception;
    72         string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "\r\n";
    73         if (error != null)
    74         {
    75             str = string.Format(strDateInfo + "Application UnhandledException:{0};\n\r堆栈信息:{1}", error.Message, error.StackTrace);
    76         }
    77         else
    78         {
    79             str = string.Format("Application UnhandledError:{0}", e);
    80         }
    81 
    82         //MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    83         LogManager.WriteLog(str);
    84     }
    85 }
  • 相关阅读:
    JDBC
    MySQL 事务
    MySQL 处理海量数据时一些优化查询速度方法
    MySQL 分支和循环结构
    MySQL 分页查询和存储过程
    Oracle PL/SQL异常、存储过程和触发器
    Oracle PL/SQL游标
    mysql主键问题
    spring-springmvc code-based
    AOP实现原理
  • 原文地址:https://www.cnblogs.com/wangshenhe/p/2769605.html
Copyright © 2011-2022 走看看