C#多线程开发-处理子线程中的异常

C#多线程开发-处理子线程中的异常

在平时的多线程开发中,对于异常的处理是至关重要的,千万不能马虎。如果在实际的项目中,对于某些线程中的异常没有处理,会直接导致整个程序崩溃,软件无法使用。

其中需要说明的是,在子线程中产生的异常是无法在主线程被捕获到,也就是你即使在使用线程方法外有try/catch也无济于事,线程中的异常只能在线程中捕获并处理。

比如下面的例子,可以看到在创建线程的代码是在try/catch中的,按照常理来说,如果子线程中有异常发生那么外部的try/catch是可以正常收到异常通知的。

static void Main(string[] args)
        {
            try
            {
                Thread tempThread = new Thread(Test); 
                tempThread.Start();
            } 
            catch (Exception ex)
            {
                Console.WriteLine("" + ex.Message);
            }
        }

        private static void Test()
        {
            Thread.Sleep(100);

            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine("" + i);
                if (i == 10)
                {
                    throw new Exception("触发异常" + i);
                }
            }
        }

运行上面的代码,可以看到程序无法在外部通过try/catch方法接收到异常,运行后软件会直接异常到子线程中,无法把异常再次往出抛。以后我们在使用线程/异步(也是一种特殊的线程)时要特别的留心。

54adcb040d18dbbeae6e5526930fa6f0.png

然而正确的做法是在子线程中捕获并处理异常。把程序进行修改,下面就可以正确捕获到异常信息。

private static void Test()
        {
            Thread.Sleep(100);
            try
            {
                for (int i = 0; i < 100; i++)
                {
                    Console.WriteLine("" + i);
                    if (i == 10)
                    {
                        throw new Exception("触发异常" + i);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("捕获的子线程中的异常信息:"+ex.Message);
            }            
        }

看下面图片,程序就在子线程中捕获到了异常信息。

eb5941f8af565f094ac901cf1380c56a.png

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发  谢谢。

3ad945ec57bc0fdbcee6ad58b4f94c31.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值