Maison > développement back-end > C++ > Comment détecter les exceptions levées dans différents threads en C# ?

Comment détecter les exceptions levées dans différents threads en C# ?

Linda Hamilton
Libérer: 2025-01-05 14:54:46
original
236 Les gens l'ont consulté

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

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 la classe offre une solution pratique. Il vous permet d'obtenir des exceptions en utilisant la propriété .Exceptions sur l'objet tâche. Voici deux approches :

  • 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);
        }
    }
    Copier après la connexion
  • 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();
        }
    }
    Copier après la connexion

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();
        }
    }
    Copier après la connexion
  • 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();
        }
    }
    Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal