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方法接收到異常,運行后軟件會直接異常到子線程中,無法把異常在次往出拋。以后我們在使用線程/異步(也是一種特殊的線程)時要特別的留心。

然而正確的做法是在子線程中捕獲並處理異常。把程序進行修改,下面就可以正確捕獲到異常信息。

        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);
            }            
        }

看下面圖片,程序就在子線程中捕獲到了異常信息。

小寄語

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

原創不易,給個關注。

我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM