背景
我們在做WinForm程序的時候,一般都是對異常進行處理,但是,我們要防止不小心出現(xiàn)未知異常,導致軟件崩潰。也可采集系統(tǒng)未知的異常信息,防止出現(xiàn)異常,也無法下手。于是就有了如這篇文章標題所述的一個簡單的需求。
代碼實現(xiàn)
1、處理未捕獲的異常
/// <summary>
///這就是我們要在發(fā)生未處理異常時處理的方法,我這是寫出錯詳細信息到文本,如出錯后彈出一個漂亮的出錯提示窗體,給大家做個參考
///做法很多,可以是把出錯詳細信息記錄到文本、數(shù)據(jù)庫,發(fā)送出錯郵件到作者信箱或出錯后重新初始化等等
///這就是仁者見仁智者見智,大家自己做了。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
string str = "";
string strDateInfo = "出現(xiàn)應(yīng)用程序未處理的異常:" + 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("應(yīng)用程序線程錯誤:{0}", e);
}
Helper.GetInstance().PlanLog(str, LogType.應(yīng)用程序異常.ToString());
//frmBug f = new frmBug(str);//友好提示界面
//f.ShowDialog();
MessageBox.Show("發(fā)生致命錯誤,請及時聯(lián)系作者!", "系統(tǒng)錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
2、處理UI線程異常
/// <summary>
/// 應(yīng)用程序的主入口點。
/// </summary>
[STAThread]
static void Main() {
try {
//可定義多個線程
Thread _UserMessageThread;
_UserMessageThread = new Thread(new ThreadStart(LoginManager.GetInstance().test));
_UserMessageThread.IsBackground = true;
_UserMessageThread.Start();
//處理未捕獲的異常
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);
Xw.Common.Sys.SysConfig.AppExwcutePath = Application.ExecutablePath;
Xw.Common.Sys.SysConfig.AppStartPath = Application.StartupPath;
Xw.Common.Sys.SysConfig.Version = "V1.0.0";
Xw.Common.Sys.SysConfig.SoftFullName = "拍鞋網(wǎng)";
Xw.Common.Sys.SysConfig.SoftName = "軟件園店";
if (!Xw.Common.Sys.SysConfig.IsOnlyRunSoft("PaiXie.Pos.Client")) {
Xw.Common.Sys.MsgBoxWin.ShowInformation("該程序已運行!");
return;
}
Application.Run(new Login());
}
catch (Exception ex) {
string str = "";
string strDateInfo = "出現(xiàn)應(yīng)用程序未處理的異常:" + 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("應(yīng)用程序線程錯誤:{0}", ex);
}
Helper.GetInstance().PlanLog(str, LogType.應(yīng)用程序異常.ToString());
//frmBug f = new frmBug(str);//友好提示界面
//f.ShowDialog();
MessageBox.Show("發(fā)生致命錯誤,請及時聯(lián)系作者!", "系統(tǒng)錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
3、處理非UI線程異常
/// <summary>
/// 應(yīng)用程序的主入口點。
/// </summary>
[STAThread]
static void Main() {
try {
//可定義多個線程
Thread _UserMessageThread;
_UserMessageThread = new Thread(new ThreadStart(LoginManager.GetInstance().test));
_UserMessageThread.IsBackground = true;
_UserMessageThread.Start();
//處理未捕獲的異常
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);
Xw.Common.Sys.SysConfig.AppExwcutePath = Application.ExecutablePath;
Xw.Common.Sys.SysConfig.AppStartPath = Application.StartupPath;
Xw.Common.Sys.SysConfig.Version = "V1.0.0";
Xw.Common.Sys.SysConfig.SoftFullName = "拍鞋網(wǎng)";
Xw.Common.Sys.SysConfig.SoftName = "軟件園店";
if (!Xw.Common.Sys.SysConfig.IsOnlyRunSoft("PaiXie.Pos.Client")) {
Xw.Common.Sys.MsgBoxWin.ShowInformation("該程序已運行!");
return;
}
Application.Run(new Login());
}
catch (Exception ex) {
string str = "";
string strDateInfo = "出現(xiàn)應(yīng)用程序未處理的異常:" + 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("應(yīng)用程序線程錯誤:{0}", ex);
}
Helper.GetInstance().PlanLog(str, LogType.應(yīng)用程序異常.ToString());
//frmBug f = new frmBug(str);//友好提示界面
//f.ShowDialog();
MessageBox.Show("發(fā)生致命錯誤,請及時聯(lián)系作者!", "系統(tǒng)錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
完整代碼
using PaiXie.Pos.Client.Core;
using PaiXie.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
namespace PaiXie.Pos.Client {
static class Program {
/// <summary>
/// 應(yīng)用程序的主入口點。
/// </summary>
[STAThread]
static void Main() {
try {
//可定義多個線程
Thread _UserMessageThread;
_UserMessageThread = new Thread(new ThreadStart(LoginManager.GetInstance().test));
_UserMessageThread.IsBackground = true;
_UserMessageThread.Start();
//處理未捕獲的異常
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);
Xw.Common.Sys.SysConfig.AppExwcutePath = Application.ExecutablePath;
Xw.Common.Sys.SysConfig.AppStartPath = Application.StartupPath;
Xw.Common.Sys.SysConfig.Version = "V1.0.0";
Xw.Common.Sys.SysConfig.SoftFullName = "拍鞋網(wǎng)";
Xw.Common.Sys.SysConfig.SoftName = "軟件園店";
if (!Xw.Common.Sys.SysConfig.IsOnlyRunSoft("PaiXie.Pos.Client")) {
Xw.Common.Sys.MsgBoxWin.ShowInformation("該程序已運行!");
return;
}
Application.Run(new Login());
}
catch (Exception ex) {
string str = "";
string strDateInfo = "出現(xiàn)應(yīng)用程序未處理的異常:" + 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("應(yīng)用程序線程錯誤:{0}", ex);
}
Helper.GetInstance().PlanLog(str, LogType.應(yīng)用程序異常.ToString());
//frmBug f = new frmBug(str);//友好提示界面
//f.ShowDialog();
MessageBox.Show("發(fā)生致命錯誤,請及時聯(lián)系作者!", "系統(tǒng)錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
///這就是我們要在發(fā)生未處理異常時處理的方法,我這是寫出錯詳細信息到文本,如出錯后彈出一個漂亮的出錯提示窗體,給大家做個參考
///做法很多,可以是把出錯詳細信息記錄到文本、數(shù)據(jù)庫,發(fā)送出錯郵件到作者信箱或出錯后重新初始化等等
///這就是仁者見仁智者見智,大家自己做了。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
string str = "";
string strDateInfo = "出現(xiàn)應(yīng)用程序未處理的異常:" + 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("應(yīng)用程序線程錯誤:{0}", e);
}
Helper.GetInstance().PlanLog(str, LogType.應(yīng)用程序異常.ToString());
//frmBug f = new frmBug(str);//友好提示界面
//f.ShowDialog();
MessageBox.Show("發(fā)生致命錯誤,請及時聯(lián)系作者!", "系統(tǒng)錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
string str = "";
Exception error = e.ExceptionObject as Exception;
string strDateInfo = "出現(xiàn)應(yīng)用程序未處理的異常:" + 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);
}
Helper.GetInstance().PlanLog(str, LogType.應(yīng)用程序異常.ToString());
//frmBug f = new frmBug(str);//友好提示界面
//f.ShowDialog();
MessageBox.Show("發(fā)生致命錯誤,請停止當前操作并及時聯(lián)系作者!", "系統(tǒng)錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
總結(jié)
針對異常,我們肯定無法事先全部預知,所以進行全局異常捕獲還是很有必要的。
該文章在 2024/3/19 11:39:14 編輯過