程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> .Net主線程撲捉子線程中的異常

.Net主線程撲捉子線程中的異常

編輯:C#入門知識

首先看一段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)
       &nb

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved