异常处理

1.多线程异常处理

           try
            {
                Thread t = new Thread((ThreadStart)delegate
                {
                    throw new Exception("多线程异常");
                });
                t.Start();
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message + Environment.NewLine + error.StackTrace);
            }

应用程序并不会在这里捕获线程t中的异常,而是会直接退出。从.NET2.0开始,任何线程上未处理的异常,都会导致应用程序的退出(先会触发AppDomain的UnhandledException)。上面代码中的try-catch实际上捕获的还是当前线程的异常,而t是属于新起的异常,所以,正确的做法应该是:

            Thread t =new Thread((ThreadStart)delegate
            {
                try
                {
                    thrownew Exception("多线程异常");
                }
                catch (Exception error)
                {
                    MessageBox.Show("工作线程异常:"+ error.Message + Environment.NewLine + error.StackTrace);
                }
            });
            t.Start();

这个时候才不会直接退出去

 

2. C#全局异常捕获添加日志记录 包括UI线程异常和非UI线程异常

 /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            try
            {
                long a = long.MaxValue;
                //处理未捕获的异常  设置应用程序处理异常方式:ThreadException处理
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                //处理UI线程异常
                Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                //处理非UI线程异常
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
                //设置最小活动线程数
                bool bSuccess = ThreadPool.SetMinThreads(60, 60);
                //初始化Application
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                //启用皮肤
                DevExpress.Skins.SkinManager.EnableFormSkins();
                DevExpress.UserSkins.BonusSkins.Register();
                //启动程序
                RunApp.Self.Run();
            }
            catch (Exception ex)
            {
                string str = string.Format("系统启动失败。异常类型:{0}\r\n异常消息:{1}\r\n异常信息:{2}\r\n",
                 ex.GetType().Name, ex.Message, ex.StackTrace);
                MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

   /// <summary>
        /// 线程异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            try
            {
                Exception ex = e.Exception;
                TxtLog.WriteException("出现应用程序线程未处理的异常:" + ex.Message, ex);
#if _SHOW_GLOBAL_EXCEPTION
            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);
            }

            MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
#endif
            }
            catch
            { }
        }
        /// <summary>
        /// 未处理异常
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                Exception ex = (Exception)e.ExceptionObject;
                TxtLog.WriteException("出现应用程序未处理的异常:" + ex.Message, ex);
#if _SHOW_GLOBAL_EXCEPTION
            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(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
#endif
            }
            catch
            { }
        }

 

3.附加一个异常消息处理方法,可以直接Show 出来,也可以把该异常方法记录到日志里面

/// <summary>
/// 生成自定义异常消息
/// </summary>
/// <param name="ex">异常对象</param>
/// <param name="backStr">备用异常消息:当ex为null时有效</param>
/// <returns>异常字符串文本</returns>
static string GetExceptionMsg(Exception ex,string backStr)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("****************************异常文本****************************");
sb.AppendLine("【出现时间】:" + DateTime.Now.ToString());
if (ex != null)
{
sb.AppendLine("【异常类型】:" + ex.GetType().Name);
sb.AppendLine("【异常信息】:" + ex.Message);
sb.AppendLine("【堆栈调用】:" + ex.StackTrace);
}
else
{
sb.AppendLine("【未处理异常】:" + backStr);
}
sb.AppendLine("***************************************************************");
return sb.ToString();
}
}

//在Catch 里面调用

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
//LogManager.WriteLog(str);
}

 

4.把异常消息记录到日志里面方法

  public static void WriteException(string message, Exception ex)
        {
            System.IO.TextWriter output = null;
            try
            {
                string exName = ex.GetType().FullName;
                string writeMeassage = string.Format("{0} 异常消息:{1}\r\n异常对象:{2}\r\n异常类型:{3}\r\n方法名称:{4}\r\n堆栈信息:{5}",
                    DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"),
                    message,
                    ex.Source,
                    exName,
                    ex.TargetSite == null ? "" : ex.TargetSite.Name,
                    ex.StackTrace);
                //在指定 TextWriter 周围创建线程安全包装。
                output = TextWriter.Synchronized(System.IO.File.AppendText(LogFileName));
                output.Write(writeMeassage);
                output.WriteLine("\r\n//***************-----------------------------------***************//");
                output.Write("\r\n");
            }
            catch { }
            finally
            {
                if (output != null)
                {
                    output.Dispose();
                    output.Close();
                }
            }
        }

5.关于正则表达式 批量修改不规则的异常处理方法见另外一篇博客

http://www.cnblogs.com/maanshancss/p/4647525.html

 

扩展链接:

http://www.cnblogs.com/luminji/archive/2011/01/05/1926033.html

http://www.jb51.net/article/31936.htm

posted @ 2015-07-31 09:16  maanshancss  阅读(396)  评论(0编辑  收藏  举报