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 :

[c# 3.5] Levé d'une exception dans un évenement


Sujet :

C#

  1. #1
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut [c# 3.5] Levé d'une exception dans un évenement
    salut tout le monde,

    j'ai un problême qui me parait étrange avec mon code c#:

    voila une classe ProcessThread, dans son constructeur je l'abonne à l'évenement "configChange", qui est déclenché quand je change la configuration via un panneau de configuration sur l'interface graphique (le code ici est exécuté en parallèle).
    Quand un évenement configChange survient, j'appelle la méthode OnChange qui lève une exception
    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
    23
    24
    25
     
    class ProcessThread
    {
    public ProcessThread()
    {
    pagConfig.configChange += newpagConfig.ConfigChangeEventHandler(OnChange);
    }
     
    public void ExecuteLoop
    {
    try
    {
    // faire quelque chose
    }
    catch (ConfigChangeException ex)
    {
    // faire quelque chose d'autre
    }
    }
     
    public void OnChange(object o, ConfigChangeEventsArgs é)
    {
    throw new ConfigChangeException("exception: la configuration a changé")
    }
    }
    pendant l'exécution, je met un point d'arrèt dans le try de la méthode ExecuteLoop pour être certain d'y être rentré. à ce moment la je change ma configuration, l'évenement configChange est enclenché, je rentre dans la méthode OnChange et la j'ai le droit à un superbe message d'erreur lié à la levée de l'exception, alors que j'aurais du tomber dans le catch de ma méthode ExecuteLoop. Je ne comprend vraiment pas ou j'ai fait une erreur ...

    merci.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si le code qui modifie la configuration n'est pas dans le try, c'est normal que ca aille pas dans le catch
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    merci.

    Maintenant le problème est que malgré tout je doit absolument sortir immédiatement du try si la configuration a changé.

    Si mon code ne marche pas, je ne sais pas comment faire,a moins de créer un booléen "configChange" de lui mettre true au passage dans "OnChange" et de mettre un if(!configChange) sur toutes les lignes de mon try... il doit y avoir une solution 100 fois meilleure mais elle m'échappe pour le moment

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est en effet une solution, et envisageable en plus

    enfin si c'est dans un thread, tu peux t'en sortir autrement, avec thread.abort ou thread.interrupt

    interrupt ca arrete tout (ca ne passe ni à la ligne d'après, ni dans le catch)

    thread.abort génère une exception, qui se propage à travers tous les bloc catch, en partant de la ligne ou est actuellement le thread
    c'est risqué, car si t'es sur une ligne de code qui appelait une méthode du framework, c'est la méthode du framework qui récupère en premier l'erreur, donc ca peut faire un comportement étrange ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    ah oui mais la je doit préciser mon code alors

    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
     
    public void ExecuteLoop()
    {
         while (unBooléenQuelconque)
         {
              // code A
              try
              {
                   // code B
              }
              catch
              {
                   // gestion exceptions
              }
              // code C
         }
    }
    quand la config change, le code B ne doit pas être exécuté, mais le code code A et C si...

    merci de t'être penché sur mon cas

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    veux tu rollbacker ce que tu fais carrément ?

    enfin il faudrait meme préciser beaucoup plus, que fais tu réellement
    et qu'est ce qui change dans la config de quoi qui t'horripiles ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    dans ma configuration, on peut modifier les identifiants de connection SQL server, l'url d'une boutique en ligne, etc...

    mais bon je pense que j'ai une solution correcte:

    un booléen configChange reçoit true quand la configuration change

    ensuite je fait
    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
     
    while (quelqueChose)
         try
         {
              // code A
              if (configChange)
              {
                   throw new ConfigChangeException("La configuration a été modifié");
              }
         }
         catch (configChangeException)
         {
              // gestion des changements de configuration
              configChange = false;
         }
         catch (SqlException)
         {
              // gestion des échecs de connection
         }
         // code B
    }
    c'est pas le top car effectivement j'aurais préféré que le code A s'arrète immédiatement mais bon visiblement j'ai pas le choix...

    bonne journée à toi!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. une exception dans le htaccess ?
    Par vega_55 dans le forum Zend Framework
    Réponses: 2
    Dernier message: 07/04/2008, 20h24
  2. Récupérer une exception dans une page d'erreur
    Par crawling5 dans le forum JSF
    Réponses: 3
    Dernier message: 15/11/2007, 08h46
  3. Réponses: 5
    Dernier message: 23/06/2006, 16h28
  4. Réponses: 2
    Dernier message: 28/08/2003, 00h00

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