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 :

Reprendre l'execution après un catch


Sujet :

C#

  1. #1
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut Reprendre l'execution après un catch
    Bonjour,

    J'aimerai savoir si il est possible de reprendre l'execution apres un catch. Je m'explique il y a un bloc try catch qui emglobe le main de mon application, et en cas d'exception j'aimerai changer une variable, puis reprendre le cour de l'execution.

    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    Non, tu ne peux pas faire ça. Pour reprendre l'exécution après un catch il va falloir gérer plus finement cette exception, c'est à dire la catcher à l'endroit où tu penses pouvoir reprendre l'exécution.

  3. #3
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Il n'y aurai pas moyen de faire "joujou" avec la callstack pour relancer l'execution. Je suis desoler mais c'est enormement de code a rajouter si cela ne fonctionne pas.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Ce que tu demandes n'a pas vraiment de sens. Une exception a été levée qque part dans le programme, tu ne sais pas où. Quelle variable voudrais-tu changer puisque tu ne sais pas d'où a été lancée l'exception ? Dans ton catch tu ferais des tas de branchements pour en fonction de la stack décider de l'action à faire ? Ce serait moche, pas du tout orienté objet et très vite un énorme sac de noeuds, autant tout de suite gérer l'exception à l'endroit qu'il faut.

  5. #5
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Pour etre plus preci je m'explique. J'ai un dataset pour la connexion a une BD distante. Lors d'une execption du a un souci de connexion a la base j'aimerai passer avec une connexion en local (Je boss avec SQL Serveur Express qui ne gere pas la replication)

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    tu fais ce qu'il t'as dit, le try catch n'est pas obligé d'englober la totalité de ta sub
    et il est aussi possible de mettre des try catch dans un try catch

    donc tu fais un try catch qui n'aura qu'une ligne ou deux dans le try, juste pour tester la connexion, si tu arrives dans le catch, tu passes en local et le code continue après le catch dans le reste de la sub
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Citation Envoyé par themadmax Voir le message
    Pour etre plus preci je m'explique. J'ai un dataset pour la connexion a une BD distante. Lors d'une execption du a un souci de connexion a la base j'aimerai passer avec une connexion en local (Je boss avec SQL Serveur Express qui ne gere pas la replication)
    J'ai mis en gras le noeud du problème. Comment peux-tu savoir dans un catch global que l'exception à eu lieu spécifiquement ici ? Tu serais obligé de faire un tas de tests...

    Le mieux c'est de gérer l'exception au niveau de la méthode qui se connecte (ou de la méthode appelante, ça dépend de la "philosophie" de ton appli):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void Connect()
    {
       try
       {
          //Connexion distante
       }
       catch(Exception)
       {
          //impossible de se connecter à ta base distante, on tente en local
       }
    }
    Bien sûr si le code sur lequel tu travailles est mal organisé et qu'il n'y a pas une méthode "Connect" unique, alors ya du boulot de refactorisation à faire. Mais mieux vaut faire propre que de rajouter une couche d'horreur au dessus .

  8. #8
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Lors d'une exception du a un souci de connexion a la base
    On peut tester le type d'exception et ne faire un catch que pour certaines :
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch System.Data.OleDb.OleDbException e 
      {
        // ce bloc ne s'éxécute pas sur une autre exception que OleDbException
       }

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Je suis d'accord sur le principe, un catch(Exception) est à proscrire, il faut catcher l'exception la plus typée possible. Cela dit ce n'est pas vraiment le problème de themadmax, qui lui doit plutôt gérer plus finement son bloc try/catch, d'ou mon exemple simplifié. Car même catcher précisément une exception de type OleDbException ne lui servira à rien dans un code de ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void main()
    {
       try
       {
           MonProgramme();
       }
       catch(OleDbException)
       {
          //trop tard ici
       }
    }

  10. #10
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    C'est cela que j'aimerai faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void main()
    {
       try
       {
           MonProgramme();
       }
       catch(OleDbException)
       {
          //Pas trop tard on change de chaine de connexion et 
          //l'on reprend où l'on en etait !
       }
    }

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Non mais on a bien compris. Réponse: ce n'est pas possible.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    faut arreter d'etre borné
    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
     
    void main()
    {
       try
       {
           //debut programme
            try
            {
                connexion distante
             }
             catch(Exception)
             {
              connexion locale
             }
           //reste du programme, dans tous les cas la connexion est bonne
       }
       catch(Exception)
       {
          //autre erreur
       }
    }
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre très actif
    Profil pro
    Expert technique .NET
    Inscrit en
    Août 2007
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Expert technique .NET

    Informations forums :
    Inscription : Août 2007
    Messages : 272
    Par défaut Petite rectification
    Juste une petite rectification, car si ma mémoire est bonne, une exception fait automatiquement sortir de la fonction sans la clause finnally.
    Sinon, je suis tout à fait d'accord sur le principe.


    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
     
    void main()
    {
       try
       {
           //debut programme
            try
            {
                connexion distante
             }
             catch(Exception)
             {
              connexion locale
             }
             finally
             {
                  //reste du programme, dans tous les cas la connexion est bonne
             }
       }
       catch(Exception)
       {
          //autre erreur
       }
    }

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Oui enfin ton finally ne sert pas à grand chose dans ton exemple, je ne vois pas ce que tu rectifies.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    pas du tout, en cas d'erreur, le code passe dans le catch et continue dans le reste de la function !!

    le finally est executé qu'on passe dans le catch ou non
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [STAThread]
    static void Main() 
    {
     try
     {
       //code de connexion
     }
    catch
     {
       Main();
     }
    }
    suffit pourtant

  17. #17
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    euh, sauf que là tu risque de boucler éternellement! Enfin c'est juste pour te donner une idée.

  18. #18
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Haha fally bien essayé . Seulement outre le fait que c'est plutot moche, avec un risque de boucle infinie, ça ne répond pas à la question d'origine. Mais attention a proposer des solutions "blague" comme ça, certains pourraient te prendre au sérieux .

  19. #19
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Citation Envoyé par fally Voir le message
    euh, sauf que là tu risque de boucler éternellement! Enfin c'est juste pour te donner une idée.
    Aie, c'était pas une blague alors

  20. #20
    Membre très actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Par défaut
    J'ai peur de ne pas comprendre! Ma réponse ne lui convient certes pas mais lui montre une piste c'est tout! Au début j'avais compris qu'il voulait réessayer de se connecter mais après je pense qu'il faut créer deux types de connexion et dans le cas où le 1er échoue passer a la seconde et continuer, un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [STAThread]
    static void Main() 
    {
     try
     {
       //code de connexion distante
     }
    catch
     {
       // code de connexion locale
     }
      Application.Run(new ma_form());
    }

Discussions similaires

  1. execution aprés chaque minute
    Par helww dans le forum C++
    Réponses: 7
    Dernier message: 06/08/2007, 11h53
  2. Problème d'exécution après compilation
    Par cococococococo dans le forum Interfaces Graphiques
    Réponses: 16
    Dernier message: 17/07/2007, 06h12
  3. [DOS] Reprendre la main après le lancement d'un programme
    Par kimz dans le forum Scripts/Batch
    Réponses: 9
    Dernier message: 28/05/2007, 23h58
  4. Réponses: 3
    Dernier message: 28/11/2006, 12h38
  5. [Sécurité] Script exécuté après paiement
    Par frol dans le forum Langage
    Réponses: 6
    Dernier message: 12/05/2006, 20h28

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