Détecter les exceptions lancées dans différents threads
Dans la programmation multithread, il peut être difficile de gérer les exceptions qui se produisent dans des threads autres que le fil conducteur. Ce problème survient lorsqu'une méthode (Méthode1) génère un nouveau thread et que ce thread exécute une autre méthode (Méthode2) qui lève une exception. La question est de savoir comment capturer cette exception dans la méthode 1.
Solution pour .NET 4 et versions ultérieures
Pour .NET 4 et versions ultérieures, Task
Gestion des exceptions dans le fil de tâches :
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); } }
Gestion des exceptions dans Demandeur Sujet :
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(); } }
Dans les deux cas, vous obtenez une AggregateException et les exceptions réelles sont accessibles via ex.InnerExceptions.
Solution pour .NET 3.5
Pour .NET 3.5, vous pouvez utiliser ce qui suit approches :
Gestion des exceptions dans le fil de discussion enfant :
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(); } }
Gestion des exceptions dans le fil de discussion de l'appelant :
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(); } }
Ces options offrent de la flexibilité dans la gestion des exceptions dans des scénarios multithread, garantissant une gestion robuste des erreurs dans vos applications.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!