首先看一段C#代码:运行后发现主线程通过try{}catch{}是不能扑捉子线程中的抛出来的异常。

代码

 class Program
    {
        static void Main(string[] args)
        {
            try
            {
                System.Threading.Thread thread = new System.Threading.Thread(new Program().run);
                thread.Start();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Thread.Sleep(1000);
        }
        public void run()
        {
            throw new Exception();
        }
    }

为什么呢?

首先需要了解异常的实现机制:异常的实现机制是严重依赖与线程的栈的。每个线程都有一个栈,线程启动后会在栈上安装一些异常处理帧,并形成一个链表的结构,在异常发生时通过该链表可以进行栈回滚,如果你自己没有安装的话,可能会直接跳到链表尾部,那可能是CRT提供的一个默认处理帧,弹出一个对话框提示某某地址内存错误等,然后确认调试,取消关闭。

所以说,线程之间是不可能发生异常处理的交换关系的。

但是在实际的程序设计中,会牵涉到扑捉子线程的异常,那么该怎样解决这个问题呢?

代码

    class Program
    {
        private delegate void ExceptionHandler(Exception ex);
        private static ExceptionHandler exception;
        private static void ProcessException(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        static void Main(string[] args)
        {
            exception = new ExceptionHandler(ProcessException);
            System.Threading.Thread thread = new System.Threading.Thread(new Program().run);
            thread.Start();

Thread.Sleep(1000);
        }
        public void run()
        {
            try
            {
                throw new Exception();
            }
            catch (Exception ex)
            {
                if (exception != null)
                {
                    exception(ex);
                }
            }
        }
    }

上面使用委托的方式,间接的解决了:把子线程中的异常信息交个主线程的一个方法去执行。(通过委托方式)

Best Reagrds,

Charles Chen

转载于:https://www.cnblogs.com/wwwzzg168/p/3570083.html

.Net主线程扑捉子线程中的异常相关推荐

  1. java主线程捕获子线程中的异常

    java主线程捕获子线程中的异常 参考文章: (1)java主线程捕获子线程中的异常 (2)https://www.cnblogs.com/jpfss/p/10272726.html (3)https ...

  2. Java中主线程如何捕获子线程抛出的异常

    Java中主线程如何捕获子线程抛出的异常 参考文章: (1)Java中主线程如何捕获子线程抛出的异常 (2)https://www.cnblogs.com/jpfss/p/10272885.html ...

  3. [转]Java中主线程如何捕获子线程抛出的异常

    这么来看待这个问题.首先明确线程代码的边界.其实很简单,Runnable接口的run方法所界定的边界就可以看作是线程代码的边界.Runnable接口中run方法原型如下:     <<   ...

  4. [Java][Android] 多线程同步-主线程等待全部子线程完毕案例

    有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...

  5. DLL内线程同步主线程研究(子线程代码放到主线程执行)

    DLL内线程同步主线程研究(子线程代码放到主线程执行) 我们在实际项目中经常会用到多线程编程,比如Socket编程等,在创建的线程内同步主线程一般使用Synchronize方法实现子线程操作放到主线程 ...

  6. java main 如何不退出_为什么java main主线程退出了子线程还能运行;golang main结束所有协程都被结束了...

    最近看golang main函数结束,所有协程都被结束了 结论是这样:A不是main程的情况下,在A程里开启B程,A程执行完,A程return之后,B程不受影响,不会挂掉.所有子协程与main程同级的 ...

  7. Java多线程之----主线程会等待子线程结束再结束么,怎么让主线程等待子线程结束呐?

    首先给出结论: 主线程和子线程之间没有谁先谁后结束这种关联,它们只是各自负责自己的线程任务,如果该线程的任务结束了,该线程自然会结束运行. talk is cheap,show me the code ...

  8. 主线程和子线程的关系(讨论主线程结束,子线程是否要回收)

    主线程和子线程,在操作系统里面其实是一样的,没有本质区别.至于主线程结束,子线程是否要回收,下面有两种比较特殊的情况. 第一种: 主线程退出了,子线程还可以执行. 主要是因为pthread_exit函 ...

  9. 【Java 多线程】Java中主线程如何捕获子线程抛出的异常

    首先明确线程代码的边界.其实很简单,Runnable接口的run方法所界定的边界就可以看作是线程代码的边界.Runnable接口中run方法原型如下: public void run(); 而所有的具 ...

最新文章

  1. jackson.ObjectMapper里enableDefaultTyping方法过期
  2. web前端开发论文写作_外语论文文献引言格式—MLA Style
  3. FAST算法学习笔记
  4. 英特尔将开源进行到底!
  5. [RocketMQ]消息中间件—RocketMQ消息消费(一)
  6. 两个Listbox的关联(省名 和 该省城市的对应)
  7. 优惠码:直通BAT面试算法精品课-牛客网
  8. 浅谈NLP中的领域自适应(Domain Adaptation) 技术
  9. python爬网易评论
  10. 计算机培训学校可行性报告,在线考试系统可行性分析报告
  11. java8时间转换函数学习,教你脱离jdf转换的痛苦
  12. 模拟电路-模拟加法器的设计和仿真
  13. oracle按照姓名查询,Oracle 10g如何对用户姓名,按首字母排序、查询
  14. 又有12款APP违规收集用户信息,下架整改
  15. 求字符串中回文子串的个数(回文树详解)
  16. 苹果手机视频去水印软件
  17. 18 打印日期 华科复试
  18. 系统开发和安全性分析
  19. 2022年全球市场电动汽车蓄电池总体规模、主要生产商、主要地区、产品和应用细分研究报告
  20. python写一个网络测速脚本_利用Python实现网络测试的脚本分享

热门文章

  1. 微信小程序: module.exports require----业务中的数据分离
  2. 360手机打开位置服务器,怎么用360手机卫士定位别人手机位置
  3. JAVA常见且基础的面试题
  4. python机器学习实战(三)
  5. 快速下载 arXiv论文
  6. stm32毕设 STM32 wifi照明控制系统 - 智能路灯(毕设分享)
  7. SVN服务器和客户端的详细安装
  8. ADC0832的使用
  9. linux好用便携电脑,ThinkPad x230i简单评测,便携且良好兼容Linux的12寸笔记本
  10. 每周一品 · Model 3 中的永磁电机