//切记debug时无效,必须要单独运行exe才有效,坑爸爸的微软
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += new ThreadExceptionEventHandler(ThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new HelperForm());
private static void ThreadException(object sender, ThreadExceptionEventArgs t)
{
DialogResult result = DialogResult.Cancel;
try
{
result = ShowThreadExceptionDialog("应用程序", t.Exception);
}
catch
{
try
{
string errorMsg = "应用程序发生错误,程序即将退出,请保存好您的当前工作!";
MessageBox.Show(errorMsg, "应用程序", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
// Exits the program when the user clicks Abort.
if (result == DialogResult.Abort)
Application.Exit();
}
// Handle the UI exceptions by showing a dialog box, and asking the user whether
// or not they wish to abort execution.
// NOTE: This exception cannot be kept from terminating the application - it can only
// log the event, and inform the user about it.
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
try
{
Exception ex = (Exception)e.ExceptionObject;
ShowThreadExceptionDialog("应用程序", ex);
}
catch (Exception exc)
{
try
{
MessageBox.Show("应用程序", exc.Message, MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
}
// Creates the error message and displays it.
private static DialogResult ShowThreadExceptionDialog(string title, Exception e)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("【异常类型】:" + e.GetType().Name);
sb.AppendLine("【异常信息】:" + e.Message);
sb.AppendLine("【堆栈调用】:" + e.StackTrace);
LogHelper.WriteErrorLog(sb.ToString());
string errorMsg = "应用程序发生错误,程序即将退出,请保存好您的当前工作!";
return MessageBox.Show(errorMsg, title, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
}