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);
}
}
看下面圖片,程序就在子線程中捕獲到了異常信息。

小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創不易,給個關注。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。
