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++Builder Discussion :

interruption du programme sur erreur [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 11
    Points : 11
    Points
    11
    Par défaut interruption du programme sur erreur
    Bonjour,

    Dans mon programme, je dois me connecter à un serveur FTP avec NMFTP.
    Si je ne gère pas les erreur et qu'il n'y a pas de connexion, il m'indique adresse distante nulle puis arrete l'execution.
    Si je gère les erreur et qu'il n'y a pas de connexion, il passe dans mon catch et continue l'execution.

    Existe-t-il un moyen de passer dans le catch puis d'arreter l'execution.

    J'espere que ma question est suffisament claire.

    Merci de votre aide

  2. #2
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    en gros comme ça:

    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
    bool __fastcall TestConnexion(){
     
      try{
       //  NMFTP....
     
      }catch(Exception &e){
          return false;
      }
      // suite de ton code
        return true;
      }
    }
     
     
    void __fastcall Button1Click(TObject* Sender)
    {
          bool ok =TestConnection();
          if(!ok)       //si connexion pas réussie
          {
              ShowMessage("la connexion a echouée");
              return;
              //Application->Terminate() ;
              //Close();
           }
    }

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    essaye avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      try {
        // ton code
      }
      catch (...) {
         // Traitement de l'erreur
        Application->Terminate();
      }

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Application->Terminate ferme completement l'application.
    Je souhaiterai juste que l'execution en cours s'arrete.
    Une sorte de suspend.
    J'ai bien essayé avec les retours de fonctions, mais les fonctions sont tellement imbriquées les unes dans les autres que je devrais gérer cette methode sur plusieurs niveaux ce qui ne m'arrange pas.

    ci-dessous le code qui provoque l'erreur lorsque je n'ai pas de connexion internet :

    Je souhaites gerer l'erreur afin que le message n'apparaisse pas.
    Mais je souhaiterais que l'interruption du programme soit identique

    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    FTP_connection();
    ShowMessage("l'application continue");
    }
    //---------------------------------------------------------------------------
    void TForm1::FTP_connection() {
    	NMFTP1->Vendor = NMOS_AUTO;
    	NMFTP1->Host = "ftp://ftp.linux.ncsu.edu/pub/fedora/linux/core/";
    	NMFTP1->UserID = "anonymous";
    	NMFTP1->Password = "anonymous@anony.com";
     
    	NMFTP1->Connect();
    	NMFTP1->Disconnect();
    }

    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    Je ne comprends pas très bien ce que tu veux arrêter...

    Mais si tu as un problème avec les retours à plusieurs niveaux, tu peux utiliser les exceptions:

    1) Tu crées une nouvelle class d'exception dérivée de Exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class EMyFTPException : public Exception {
      EMyFTPException(Exception& err) : Exception(err) {};
    }
    2) Tu fais un try-catch autour de la tentative de connection pour intercepter localement l'erreur. Si elle apparaît, alors tu reportes TON exception vers le "haut"
    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
    void TForm1::FTP_connection() {
      NMFTP1->Vendor = NMOS_AUTO;
      NMFTP1->Host = "ftp://ftp.linux.ncsu.edu/pub/fedora/linux/core/";
      NMFTP1->UserID = "anonymous";
      NMFTP1->Password = "anonymous@anony.com";
     
      try {
        NMFTP1->Connect();
      }
      catch (Exception& err) {
        throw EMyFTPException(err);
      }
     
      NMFTP1->Disconnect();
    }
    3) A n'importe quel niveau supérieur, tu peux faire un try-catch avec TON exception pour savoir s'il y a eu plantage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      try {
        TesterLaConnection();
      }
      catch (EMyFTPException& err) {
        // Il y a eu une erreur!!
        ShowMessage("Erreur lors de la connection: "+err.Msg);
      }
    Je n'ai pas testé ce code, mais je pense que le principe est ok

  6. #6
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    et comme ça ?

    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
     
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       bool ok =FTP_connection();
       if(!ok) return;
       ShowMessage("l'application continue");
    }
    //---------------------------------------------------------------------------
    bool TForm1::FTP_connection() {
      try{
        NMFTP1->Vendor = NMOS_AUTO; 
        NMFTP1->Host = "ftp://ftp.linux.ncsu.edu/pub/fedora/linux/core/";
        NMFTP1->UserID = "anonymous";
        NMFTP1->Password = "anonymous@anony.com";
     
        NMFTP1->Connect();    
        NMFTP1->Disconnect();
        return true;
      }catch(Exception &e){
         return false;
      }
    }

    [Edit] Grillé (dslé jte le laisse..) [/Edit]

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/12/2011, 10h05
  2. [Reseau] Execution de programmes sur un autre PC
    Par el3gans dans le forum Général Java
    Réponses: 5
    Dernier message: 18/11/2004, 11h20
  3. code retour UNIX sur erreur ORA
    Par vinz_07 dans le forum Administration
    Réponses: 7
    Dernier message: 25/08/2004, 11h04
  4. Methode de programmation sur des gros projets
    Par dynobremo dans le forum EDI
    Réponses: 10
    Dernier message: 08/06/2004, 02h59
  5. Déclenchement Programme sur Virtual Key
    Par Tom-G dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 09/05/2003, 12h58

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