Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menangkap Pengecualian yang Dilemparkan daripada Benang Berasingan dalam .NET?

Bagaimanakah Saya Boleh Menangkap Pengecualian yang Dilemparkan daripada Benang Berasingan dalam .NET?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-06 00:49:39185semak imbas

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

Menangkap Pengecualian yang Dilemparkan dalam Benang Berbeza: Panduan Komprehensif

Artikel ini menangani masalah biasa menangkap pengecualian yang dibangkitkan dalam urutan berasingan daripada panggilan kaedah. Isu timbul apabila kaedah (Kaedah1) menghasilkan benang baharu dan semasa pelaksanaan dalam utas itu (Kaedah2), pengecualian berlaku. Cabarannya terletak pada penghantaran maklumat pengecualian ini kembali ke Kaedah1.

Penyelesaian

Dalam .NET 4 dan versi yang lebih baru, Task kelas menyediakan penyelesaian yang elegan. Dengan menggunakan kelas ini, anda boleh:

1. Pengendalian Pengecualian Asingkan dalam Benang Tugasan

Dalam pendekatan ini, anda boleh memproses pengecualian dalam urutan tugasan, seperti yang dilihat dalam coretan kod berikut:

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. Mengendalikan Pengecualian dalam Benang Pemanggil

Sebagai alternatif, anda boleh memproses pengecualian dalam urutan pemanggil menggunakan kod ini:

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

Perhatikan bahawa pengecualian yang diperoleh adalah daripada jenis AggregateException, dengan pengecualian sebenar yang disimpan dalam ex.InnerExceptions harta benda.

.Penyelesaian BERSIH 3.5

Dalam .NET 3.5, terdapat dua pendekatan:

1. Pengendalian Pengecualian dalam Benang Kanak-kanak

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. Pengendalian Pengecualian dalam Benang Pemanggil

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

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menangkap Pengecualian yang Dilemparkan daripada Benang Berasingan dalam .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn