在有的操作系统中winform程序出现异常的时候,并不会弹出异常对话框,而是直接退出了,没有任何迹象,但是在系统的事件查看器(eventvwr.exe)中会发现这个异常。
为了能够捕捉到程序的异常,我们需要加一个全局异常的捕捉代码,当软件无故退出的时候,这样就能发现异常出现的具体位置。
网上有一些代码,但是没有说明具体的用法,有的是创建了一个异常捕捉类,在程序入口点去实例化。但是我们大多不愿意去多创建这个类,这个时候只要在Program.cs文件中添加代码去捕捉就行了,捕捉到了之后直接注释掉,简单,实用。
下面是整理过的:
在Program.cs中添加捕捉异常代码,添加后的类如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
using System.IO;
namespace logtest
{
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);
#region Program.cs自动生成的代码
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// 程序入口点
Application.Run(new Form1());
#endregion
//}
//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);
// }
// MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
// writeLog(str);
//}
}
#region 捕捉全局异常代码
///// </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);
// }
// MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
// writeLog(str);
//}
//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);
// }
// MessageBox.Show(str, "系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
// writeLog(str);
//}
///// <summary>
///// 写文件
///// </summary>
///// <param name="str"></param>
//static void writeLog(string str)
//{
// string ErrPath = AppDomain.CurrentDomain.BaseDirectory;
// if (!Directory.Exists(ErrPath))
// {
// Directory.CreateDirectory(ErrPath);
// }
// using (StreamWriter sw = new StreamWriter( @"D:\ErrLog.txt", true))
// {
// sw.WriteLine(str);
// sw.WriteLine("---------------------------------------------------------");
// sw.Close();
// }
//}
#endregion
上面加注释的部分就是异常捕捉的代码,当程序中任何位置出现异常时,会弹出对话框,报出异常的位置,大大方便了代码的调试。
writeLog()方法是把异常的信息输出到日志文件,我是不需要,直接在弹出的对话框中就可以看见异常的位置了,不过可是使用,注意要保证路径正确并且有写入的权限。