Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menangkap Pengecualian yang Dilemparkan dalam Benang Berbeza dalam C#?

Bagaimana untuk Menangkap Pengecualian yang Dilemparkan dalam Benang Berbeza dalam C#?

Linda Hamilton
Lepaskan: 2025-01-05 14:54:46
asal
276 orang telah melayarinya

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

Menangkap Pengecualian yang Dilemparkan dalam Benang Berbeza

Dalam pengaturcaraan berbilang benang, ia boleh menjadi mencabar untuk mengendalikan pengecualian yang berlaku dalam utas selain daripada benang utama. Isu ini timbul apabila satu kaedah (Kaedah1) menghasilkan benang baharu, dan benang itu melaksanakan kaedah lain (Kaedah2) yang mengeluarkan pengecualian. Persoalannya ialah bagaimana untuk menangkap pengecualian ini dalam Kaedah1.

Penyelesaian untuk .NET 4 dan Ke Atas

Untuk .NET 4 dan versi yang lebih baru, Task kelas menawarkan penyelesaian yang mudah. Ia membolehkan anda mendapatkan pengecualian menggunakan sifat .Exceptions pada objek tugas. Berikut ialah dua pendekatan:

  • Mengendalikan Pengecualian dalam Benang Tugas:

    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
  • Mengendalikan Pengecualian dalam Pemanggil Thread:

    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

Dalam kedua-dua kes, anda mendapat AggregateException dan pengecualian sebenar boleh diakses melalui ex.InnerExceptions.

Penyelesaian untuk .NET 3.5

Untuk .NET 3.5, anda boleh menggunakan pendekatan berikut:

  • Mengendalikan 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
  • Mengendalikan Pengecualian dalam Pemanggil Thread:

    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

Pilihan ini memberikan fleksibiliti dalam mengendalikan pengecualian dalam senario berbilang benang, memastikan pengurusan ralat yang mantap dalam aplikasi anda.

Atas ialah kandungan terperinci Bagaimana untuk Menangkap Pengecualian yang Dilemparkan dalam Benang Berbeza dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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