首頁 > 後端開發 > C++ > C#中如何捕捉不同執行緒中拋出的例外狀況?

C#中如何捕捉不同執行緒中拋出的例外狀況?

Linda Hamilton
發布: 2025-01-05 14:54:46
原創
234 人瀏覽過

How to Catch Exceptions Thrown in Different Threads in C#?

捕捉不同執行緒中拋出的例外狀況

在多執行緒程式設計中,處理除執行緒之外的執行緒中發生的例外狀況可能具有挑戰性主線程。當一個方法 (Method1) 產生一個新線程,並且該線程執行另一個引發例外狀況的方法 (Method2) 時,就會發生此問題。問題是如何在 Method1 中捕獲此異常。

.NET 4 及以上版本的解決方案

對於 .NET 4 及更高版本,Task;類別提供了一個方便的解決方案。它允許您使用任務物件上的 .Exceptions 屬性來取得異常。這裡有兩種方法:

  • 處理任務執行緒中的異常:

    class Program
    {
        static void Main(string[] args)
        {
            Task<int> task = new Task<int>(Test);
            task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
            task.Start();
            Console.ReadLine();
        }
    
        static int Test()
        {
            throw new Exception();
        }
    
        static void ExceptionHandler(Task<int> task)
        {
            var exception = task.Exception;
            Console.WriteLine(exception);
        }
    }
    登入後複製
  • 處理任務執行緒中的例外呼叫者主題:

    class Program
    {
        static void Main(string[] args)
        {
            Task<int> task = new Task<int>(Test);
            task.Start();
    
            try
            {
                task.Wait();
            }
            catch (AggregateException ex)
            {
                Console.WriteLine(ex);
            }
    
            Console.ReadLine();
        }
    
        static int Test()
        {
            throw new Exception();
        }
    }
    登入後複製

在這兩種情況下,您都會得到AggregateException,並且實際的異常可以透過 ex.InnerExceptions 存取。

解決方案對於 .NET 3.5

對於 .NET 3.5之後,可以使用以下方法:

  • 子執行緒中的異常處理:

    class Program
    {
        static void Main(string[] args)
        {
            Exception exception = null;
            Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), Handler));
            thread.Start();
    
            Console.ReadLine();
        }
    
        private static void Handler(Exception exception)
        {
            Console.WriteLine(exception);
        }
    
        private static void SafeExecute(Action test, Action<Exception> handler)
        {
            try
            {
                test.Invoke();
            }
            catch (Exception ex)
            {
                Handler(ex);
            }
        }
    
        static void Test(int a, int b)
        {
            throw new Exception();
        }
    }
    登入後複製
  • class Program
    {
        static void Main(string[] args)
        {
            Exception exception = null;
            Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), out exception));
    
            thread.Start();
    
            thread.Join();
    
            Console.WriteLine(exception);
    
            Console.ReadLine();
        }
    
        private static void SafeExecute(Action test, out Exception exception)
        {
            exception = null;
    
            try
            {
                test.Invoke();
            }
            catch (Exception ex)
            {
                exception = ex;
            }
        }
    
        static void Test(int a, int b)
        {
            throw new Exception();
        }
    }
    登入後複製
處理呼叫者的例外主題:

這些選項提供了在多執行緒場景中處理異常的靈活性,確保應用程式中強大的錯誤管理。

以上是C#中如何捕捉不同執行緒中拋出的例外狀況?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板