首頁 > 後端開發 > C++ > 如何捕捉 .NET 中單獨執行緒引發的例外狀況?

如何捕捉 .NET 中單獨執行緒引發的例外狀況?

Mary-Kate Olsen
發布: 2025-01-06 00:49:39
原創
167 人瀏覽過

How Can I Catch Exceptions Thrown from a Separate Thread in .NET?

捕獲不同線程中引發的異常:綜合指南

本文解決了從調用者捕獲單獨線程中引發的異常的常見問題方法。當方法 (Method1) 產生新線程,並且在該線程 (Method2) 中執行期間發生例外狀況時,就會出現問題。挑戰在於將此異常訊息傳回方法 1。

解決方案

在 .NET 4 及更高版本中,Task類別提供了一個優雅的解決方案。透過使用此類,您可以:

1.在任務執行緒中單獨處理異常

在這種方法中,您可以在任務執行緒中處理異常,如以下程式碼片段所示:

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);
    }
}
登入後複製

2.在呼叫者執行緒中處理異常

或者,您可以使用以下程式碼在呼叫者執行緒中處理例外狀況:

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中,有兩種​​方法:

1.子線程中的異常處理

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();
    }
}
登入後複製

2.調用者線程中的異常處理

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();
    }
}
登入後複製

以上是如何捕捉 .NET 中單獨執行緒引發的例外狀況?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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