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 :

"throw" dans une fonction


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    1ère année IUT Informatique
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : 1ère année IUT Informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Par défaut "throw" dans une fonction
    Bonjour à tous !

    Après une petite recherche sur le site et sur le Web, je n'ai malheureusement pas trouvé mon bonheur .

    Je vous montre le code, et je vous explique ce que je souhaite que ça fasse.

    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
     
    #include <iostream>
     
    using namespace std;
     
    int diviser(const int nb1, const int nb2) throw (string);
     
    int main()
    {
        cout << diviser(2, 0) << endl;
        return 0;
    }
     
    int diviser(const int nb1, const int nb2) throw (string)
    {
        if (nb2 == 0)
            throw (string("Erreur"));
     
        return (nb1 / nb2);
    }
    En fait, ce code est censé faire une division (qui renvoie un entier, mais là n'est pas le problème :p) et si le dénominateur vaut 0, alors il faut afficher l'erreur spécifiée, c'est-à-dire "Erreur : division par zero".

    Mais quand j'appelle cette fonction dans mon main, le message qui apparaît est :

    "This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information."

    avec le code d'erreur 3. En plus, j'ai même droit à la fenêtre Windows qui me dit que mon programme a cessé de fonctionner !

    Bref, si vous pouviez m'éclairer à ce sujet, je vous en serai reconnaissant

    Merci d'avance.

    PS : je suis ouvert à toute solution, mais de préférence essayez de garder le "throw" dans l'entête de la fonction.
    PS2 : Mon EDI est Code Blocks si ça peut aider.

  2. #2
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Tu apprendras bientôt que jeter une std::string, c'est moche, et que jeter une std::logic_error, c'est bien.

    Sinon, la solution pour ton code réside au niveau de l'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main() {
      try {
        cout << diviser(2, 0) << endl;
      } catch(std::string const & s) {
        cout << s << endl;
      }
      // return 0; inutile en fin de main.
    }

  3. #3
    Candidat au Club
    Homme Profil pro
    1ère année IUT Informatique
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : 1ère année IUT Informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Par défaut
    Citation Envoyé par Ekleog Voir le message
    Tu apprendras bientôt que jeter une std::string, c'est moche, et que jeter une std::logic_error, c'est bien.

    Sinon, la solution pour ton code réside au niveau de l'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main() {
      try {
        cout << diviser(2, 0) << endl;
      } catch(std::string const & s) {
        cout << s << endl;
      }
      // return 0; inutile en fin de main.
    }
    Merci à toi Ekleog, ce code fonctionne parfaitement
    Mais quelle est la différence entre "string" et "logic_error" ? Est-ce que, comme son nom l'indique, "logic_error" renvoie un "message système" plus pertinent ?

    Ah oui, pourquoi un passage par référence pour le string ?

  4. #4
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    logic_error dérive de std::exception ; ce qui est un comportement standard.
    Ce qui permet d'interopérer avec les OS, comme par exemple windows qui aurait peut-être pû te renvoyer un message plus pertinent.

    Pour le passage par référence, c'est simplement une bonne pratique : pourquoi copier la std::string d'erreur ?

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

Discussions similaires

  1. [PowerShell] double quotes et variables dans une ligne de script Powershell
    Par Aenean dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 08/12/2014, 17h55
  2. [vbnet 1.1]Inserer deux simple quote sans texte dans une db
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/03/2007, 08h51

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