捕获程序中未捕获的异常


还记得之前的一个项目,扯到网络数据传输,第三方接口调用,数据库之类的,突然有一天在运行的时候就死掉了。留我在风中凌乱。项目代码说多不多, 说少也不少,该从何下手去找这个该死的异常呢。
直到今天我看了《改善程序的157个建议》, 我才知道程序中没有捕获的异常也是能捕获到的,我是有多才疏学浅。。

它是这么说的~~~~~~~~~~~~~~~

建议65:总是处理未捕获的异常

     
      处理未捕获的异常是每个应用程序应具备的基本功能,C#在 AppDomain中 提供了 UnhandledException 事件 来接收未捕获到的异常通知。
 static void Main(string[] args)
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            Console.Read();
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Exception ex = (Exception)e.ExceptionObject;
            Console.WriteLine("未被捕获的异常:" + ex.Message);
        }

可以通过此事件 将未捕获的异常信息记录到日志文件中。 值得注意的是,UnhandledException 提供的机制并不能应用程序的终止,也就是说,执行完 CurrentDomain_UnhandledException 方法后,应用程序就会被终止。

如果是窗体程序,还存在引发Application.ThreadException事件来处理windos窗体线程中所引发的未处理的异常。
即:在windows窗体程序中,使用ThreadException事件来处理UI线程异常,UnhandledException 来处理非UI线程异常。ThreadException 可以阻止应用程序终止。

 static void Main(string[] args)
        {         
            Application.ThreadException += Application_ThreadException;
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            Application.Run(new ErrorHandlerForm());
        }

        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            try
            {
                string errorMsg = "Windows 窗体程序异常 : \n\n";
                MessageBox.Show(errorMsg + e.Exception.Message + Environment.NewLine + e.Exception.StackTrace);
            }
            catch
            {
                try
                {
                    MessageBox.Show(" 不可恢复的Windows 窗体异常,程序即将退出!");
                }
                finally
                {
                    Application.Exit();
                }
            }
        }

以上是Windows窗体程序, 接下来介绍WPF程序。WPF的UI线程和Windows的UI线程有点不一样。WPF的UI交给了一个叫调度器的类:Dispatcher。代码如下:
 public App()
        {
            this.DispatcherUnhandledException += App_DispatcherUnhandledException;
        }

        void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            try
            {
                string errorMsg = "WPF 窗体程序异常 : \n\n";
                MessageBox.Show(errorMsg + e.Exception.Message + Environment.NewLine + e.Exception.StackTrace);
            }
            catch
            {
                try
                {
                    MessageBox.Show(" 不可恢复的WPF 窗体异常,程序即将退出!");
                }
                finally
                {
                    Application.Current.Shutdown();
                }
            }
            e.Handled = true;// 加上这句代码是必须的。 指示异常信息已经被捕获,防止异常事件继续路由下去。
        }


值得注意的是:不管是否是窗体程序,UnhandledException 都是存在的且有效的。不管是Windows窗体还是WPF窗体程序,UI线程异常事件机制都能阻止程序的退出。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值