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