异常处理
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.cnblogs.com/maanshancss/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。所有源码遵循Apache协议,使用必须添加 from maanshancss
出处:http://www.cnblogs.com/maanshancss/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。所有源码遵循Apache协议,使用必须添加 from maanshancss