zoukankan      html  css  js  c++  java
  • 异常处理

    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}
    异常消息:{1}
    异常信息:{2}
    ",
                     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() + "
    ";
                Exception error = e.Exception as Exception;
    
                if (error != null)
                {
                    str = string.Format(strDateInfo + "异常类型:{0}
    异常消息:{1}
    异常信息:{2}
    ",
                    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() + "
    ";
                if (error != null)
                {
                    str = string.Format(strDateInfo + "Application UnhandledException:{0};
    
    堆栈信息:{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}
    异常对象:{2}
    异常类型:{3}
    方法名称:{4}
    堆栈信息:{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("
    //***************-----------------------------------***************//");
                    output.Write("
    ");
                }
                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

  • 相关阅读:
    三级联动
    投票系统
    增删改查
    PHP基础
    查询练习
    高级查询
    高级查询练习题
    0510课堂02三元运算符,跳转语句,循环结构
    0510课堂
    050602课堂css3旋转、过渡、动画
  • 原文地址:https://www.cnblogs.com/maanshancss/p/4691197.html
Copyright © 2011-2022 走看看