首页  ·  知识 ·  编程语言
.NET全局的异常处理
网友    .NET  编辑:dezai   图片来源:网络
从 .NET 2.0 开始,任何一个线程上未处理的异常都会导致整个应用程序关闭。因此,在每个线程入口方法中都必须要使用 try/catch 语句,至少在产品应用程序中必须如
 从 .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)
    {
        // 异常日志记录,或者通知其他线程出现异常了
        ...
    }
}

本文作者:网友 来源:网络
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读