首页 > 编程 > C# > 正文

C# WinForm捕获未处理的异常实例解析

2020-01-24 02:26:08
字体:
来源:转载
供稿:网友

本文以一个完整的实例形式讲述了C# WinForm捕获未处理的异常的方法。分享给大家供大家参考之用。具体代码如下:

using System;using System.Collections.Generic;using System.Windows.Forms;using System.IO;namespace GobalException{  static class Program  {    /// <summary>    /// 应用程序的主入口点。    /// </summary>    [STAThread]    static void Main()    {      try      {        //处理未捕获的异常          Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);        //处理UI线程异常          Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);        //处理非UI线程异常          AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);        Application.EnableVisualStyles();        Application.SetCompatibleTextRenderingDefault(false);        Application.Run(new Form1());      }      catch (Exception ex)      {        string str = "";        string strDateInfo = "出现应用程序未处理的异常:" + DateTime.Now.ToString() + "/r/n";        if (ex != null)        {          str = string.Format(strDateInfo + "异常类型:{0}/r/n异常消息:{1}/r/n异常信息:{2}/r/n",             ex.GetType().Name, ex.Message, ex.StackTrace);        }        else        {          str = string.Format("应用程序线程错误:{0}", ex);        }        writeLog(str);//frmBug f = new frmBug(str);//友好提示界面      //f.ShowDialog();        MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);      }    }    /// <summary>    ///这就是我们要在发生未处理异常时处理的方法,我这是写出错详细信息到文本,如出错后弹出一个漂亮的出错提示窗体,给大家做个参考    ///做法很多,可以是把出错详细信息记录到文本、数据库,发送出错邮件到作者信箱或出错后重新初始化等等    ///这就是仁者见仁智者见智,大家自己做了。    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)    {            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);      }      writeLog(str);  //frmBug f = new frmBug(str);//友好提示界面      //f.ShowDialog();      MessageBox.Show("发生致命错误,请及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);    }    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)    {      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);      }      writeLog(str);//frmBug f = new frmBug(str);//友好提示界面      //f.ShowDialog();      MessageBox.Show("发生致命错误,请停止当前操作并及时联系作者!", "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);    }    /// <summary>    /// 写文件    /// </summary>    /// <param name="str"></param>    static void writeLog(string str)    {      if (!Directory.Exists("ErrLog"))      {        Directory.CreateDirectory("ErrLog");      }      using (StreamWriter sw = new StreamWriter(@"ErrLog/ErrLog.txt", true))      {        sw.WriteLine(str);        sw.WriteLine("---------------------------------------------------------");        sw.Close();      }    }  }}

本文实例配有较为详尽的注释,便于大家阅读理解。希望本文所述对大家的C#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表