我们在做WinForm程序的时候,一般都是对异常进行处理,但是,我们要防止不小心出现未知异常,导致软件崩溃。
针对异常,我们肯定无法事先全部预知,所以进行全局异常捕获还是很有必要的。
封装类
public class ExceptionHelper
{
public static event Action ExceptionOver;
public static void AddGlobalObserve()
{
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);//处理处理未捕获的异常
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); //处理UI线程异常
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);//处理非UI线程异常
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
}
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
HandleException(TerminalStatus.ThreadCrash, (System.Exception)e.ExceptionObject);
}
//处理UI线程异常
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
HandleException(TerminalStatus.InterfaceCrash, e.Exception);
}
private static void HandleException(TerminalStatus ts, System.Exception ex)
{
//记录系统错误
new Exception().Insert(ts, ex);
ExceptionOver();
}
}
捕获到异常后处理办法有很多,可以是把出错详细信息记录到文本、数据库,发送出错邮件到作者信箱或出错后重新初始化等等
调用方法
static class Program
{
[STAThread]
static void Main()
{
//异常监控
ExceptionHelper.AddGlobalObserve();
ExceptionHelper.ExceptionOver += ExceptionMonitor_ExceptionOver;
//初始化
Application.Run(new frmMain());
}
private static void ExceptionMonitor_ExceptionOver()
{
FrmDialog.ShowDialog(null, "系统遇到未知异常,即将重新启动。", "系统异常", true);
Process.Start(Application.ExecutablePath);
Process.GetCurrentProcess().Kill();
}
}