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
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!