.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)
    {
        // 异常日志记录,或者通知其他线程出现异常了
        ...
    }
}

关联文档