130 votes

attraper l'exception qui est jetée dans un fil différent

Une de mes méthodes ( Method1 ) génère un nouveau thread. Ce thread exécute une méthode ( Method2 ) et une exception est levée lors de l'exécution. J'ai besoin d'obtenir cette information d'exception sur la méthode d'appel ( Method1 )

Est-ce que je peux attraper cette exception en Method1 qui est levée en Method2 ?

212voto

oxilumin Points 2894

Dans .NET 4 et au-dessus, vous pouvez utiliser Task<T> de la classe au lieu de créer un nouveau thread. Ensuite, vous pouvez obtenir des exceptions à l'aide .Exceptions propriété de l'objet tâche. Il y a 2 façons de le faire: 1 - dans des locaux séparés de la méthode: // traiter l'exception de certaines tâches du thread

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 - dans la même méthode: // traiter l'exception de l' appelant fil

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

Notez que l'exception que vous obtenez est AggregateException. Tous les immobiliers d'exception sont disponibles par le biais ex.InnerExceptions de la propriété.

Dans .NET 3.5 , vous pouvez utiliser le code suivant: // traiter l'exception de l' enfant thread

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();
        }
        catch (Exception ex)
        {
            Handler(ex);
        }
    }

    static void Test(int a, int b)
    {
        throw new Exception();
    }
}

Ou // Vous d'exception en l' appelant fil

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();
        }
        catch (Exception ex)
        {
            exception = ex;
        }
    }

    static void Test(int a, int b)
    {
        throw new Exception();
    }
}

11voto

ermau Points 991

Vous ne pouvez pas intercepter l'exception dans Method1. Vous pouvez toutefois intercepter l'exception dans Method2 et l'enregistrer dans une variable que le thread d'exécution d'origine peut ensuite lire et utiliser.

1voto

sizar surani Points 21

vous pouvez utiliser quelque chose comme ça

 Thread thread = new Thread(delegate() {
    try
    {
        MyIPoller.Start();
    }
    catch(ThreadAbortException)
    {
    }
    catch(Exception ex)
    {
        //handle
    }
    finally
    {
    }
});
 

Cela garantira que l'exception ne parviendra pas au sommet du fil.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X