IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Catch exception multithread


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Par défaut Catch exception multithread
    Bonjour,

    J'ai une application qui crée plusieurs threads et dont le main est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [STAThread]
    static void Main()
    {
    	try
    	{
    										// Create the main window
    		Main mMain = new Main();
    		// Load the plugin interface
    		mMain.LoadInterface();
    		// Load the configuration
    		mMain.LoadConfiguration();
    		// Show the main window
    		mMain.Show();
     
    		Application.Run(mMain);
    	}
    	catch(Exception eException)
                {
    		// Display a message
    		ErrorMessage.Show(eException)
    	}
    }
    La fenêtre principal appel un composant qui crée plusieurs threads, le problème est que si une exception est levée dans un des threads, elle n'est pas catchée par le try catch du main.
    Est ce normal?
    Comment puis je faire pour catcher les exceptions levées par les threads?

    Merci pour votre aide

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    c'est normal oui (et logique meme)

    mais ce n'est pas vraiment une question de thread, c'est plus une question de membre (void, property ...)
    un membre n'ayant pas de try catch remonte l'erreur à son appelant, si l'appelant est un point de départ et qu'il n'a pas de try catch l'erreur fait planter l'appli.
    un point de départ est soit le void de démarrage d'un thread, soit une méthode appelée par un évent etc...

    donc des try catch il faut en mettre pas mal en général
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Par défaut
    ????

    Si je mets un try catch dans la fonction Main du programme, toutes les exceptions sont catchées par ce try catch et ce, quelque soit le membre, classe... Donc un seul try catch et des levées d'exceptions correctes peuvent suffir si aucune exception particulière n'est à retraitée par l'application.
    Cela est vrai tant que le code est éxécuté sur le thread principal. mais lors de la levée d'une exception dans un autre thread, l'exception n'est pas catchée dans le main d'où ma question.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    tu m'as mis le doute je viens de tester, en effet le application.run attrape toutes les erreurs (en vb.net on démarre rarement sur un sub main mais sur une form (code caché généré automatiquement))
    merci d'ailleurs pour cette découverte, c'est bien pratique

    sinon j'ai pas dit que des conneries, si tu veux catcher les erreurs d'un thread, il faut mettre un try catch dans le void sur lequel tu démarre le thread
    tout comme tu mets un try catch sur le void main démarré par le thread principal en fait
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre actif

    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 20
    Par défaut
    La procédure qui lance le thread n'as aucun controle sure ce dernier. le thread étant lancé comme un processus indépendant au sein de l'application ne peut que s'auto controler. donc si tu doit mettre un try /catch tu doit le faire au sein du corps de la fonction lancé en thread, et pas dans l'appelant. et pour les opérations de débogage oriente les messages d'erreur vers la sortie de débogage de lapplication.(Console.WriteLine)

  6. #6
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Je confirme le try/catch du main qui est exécuté par le thread principal n'est pas en mesure de catcher des exceptions des threads qu'il a lancé car ils ne s'executent pas dans le même contexte

    Tu peux par contre utiliser la propriété ExceptionEvent ? ou quelque chose comme cela des objets threads pour rediriger vers la fonction à exécuter.

    Cela ressemblerait à cela dans ton main :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mMain.Threads.ExceptionEvent = mMain.ExceptionEvent:

Discussions similaires

  1. try catch exception
    Par gaut02 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/03/2009, 15h42
  2. Réponses: 2
    Dernier message: 02/12/2008, 11h45
  3. Code erreur d'un Try, Catch (exception e)
    Par davelop dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 06/10/2008, 19h00
  4. Catch exception en asp?
    Par jamesleouf dans le forum ASP
    Réponses: 5
    Dernier message: 22/05/2008, 19h25
  5. probleme try catch, Exception
    Par Slumpy dans le forum VB.NET
    Réponses: 9
    Dernier message: 23/03/2007, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo