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
Lepaskan: 2025-01-06 00:49:39
asal
165 orang telah melayarinya

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);
    }
}
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan