.NET全局的异常处理
从 .NET 2.0 开始,任何一个线程上未处理的异常都会导致整个应用程序关闭。因此,在每个线程入口方法中都必须要使用 try/catch 语句,至少在产品应用程序中必须如此,以免应用程序因为我们未预料到的代码而关闭整个应用程序。
如果仅仅记下异常信息而不在乎应用程序异常关闭,那么有两个方法可以做到:
1、对于 Windows Form 程序来说,有一个全局异常处理事件:Application.ThreadException;
2、对于所有 .NET 程序来说,还有一个更低级的全局异常处理事件:AppDomain.UnhandledException;
示例:
///<summary>
/// 应用程序的主入口点。
///</summary>
[STAThread]
static void Main()
{
///添加主线程的全局异常处理
Application.ThreadException += new
ThreadExceptionEventHandler(
MainUIThreadExceptionHandler);
Application.Run(new Form1());
}
public static void MainUIThreadExceptionHandler(Exception ex)
{
MainUIThreadExceptionHandler(null, new
ThreadExceptionEventArgs(ex));
}
///<summary>
/// 主线程全局异常信息的处理
///</summary>
///<param name="sender"></param>
///<param name="t"></param>
public static void MainUIThreadExceptionHandler(object
sender, ThreadExceptionEventArgs e)
{
MessageBox.Show(
"应用程序发生了如下的异常信息"
+ ":" + (char)13
+ (char)13 + e.Exception.Message
+ (char)13 + (char)13
+ "请于系统管理员取得联系!"
+ (char)13 + (char)13
, "异常信息"
, MessageBoxButtons.OK
, MessageBoxIcon.Error
, MessageBoxDefaultButton.Button1
, MessageBoxOptions.ServiceNotification);
}
一个值得注意的写法:
public static void Main()
{
new Thread (Go).Start();
}
private static void Go()
{
try
{
...
throw null; // 该异常将会被捕获
...
}
catch (Exception ex)
{
// 异常日志记录,或者通知其他线程出现异常了
...
}
}
详细参考:
http://terrylee.cnblogs.com/archive/2005/12/12/295243.html
http://www.cnblogs.com/cdts_change/archive/2010/10/10/1847286.html
http://www.cnblogs.com/AutumnalRiver/archive/2010/04/11/1709627.html