Exercice sur les exceptions

doute sur mon code

a marqué ce sujet comme résolu.

Bonjour à tous je suis en train de faire le cours de c++. j’ai un soucis avec un des exercices celui se trouvant dans la partie "Attends que je t’attrape"

J’ai pensé à un code qui n’est pas celui donné en corrigé mais qui selon ma logique pourrait fonctionner. Hélas il ne fonctionne pas j’aimerais savoir mon erreur.

#include <fstream>
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>

std::vector<std::string> lire_fichier(std::string const& nom_fichier)
{
    std::vector<std::string> lignes{};
    std::string ligne{ "" };

    std::ifstream fichier{ nom_fichier };
    if (!fichier)
    {
        throw std::runtime_error("Fichier impossible à ouvrir.");
    }

    while (std::getline(fichier, ligne))
    {
        lignes.push_back(ligne);
    }

    return lignes;
}

int main()
{
    std::string nom_fichier{ "" };
    std::cout << "Donnez un nom de fichier : ";
    std::cin >> nom_fichier;

    try
    {
        // Dans le try, on est assuré que toute exception levée
        // pourra être traitée dans le bloc catch situé après.

        auto lignes = lire_fichier(nom_fichier);
        std::cout << "Voici le contenu du fichier :" << std::endl;
        for (auto const& ligne : lignes)
        {
            std::cout << ligne << std::endl;
        }
    }
    // Notez qu'une exception s'attrape par référence constante.
    catch (std::runtime_error const& exception)
    {
        // On affiche la cause de l'exception.
        std::cout << "Erreur : " << exception.what() << std::endl;
         /*****/
        std::cout << "Donnez un nom de fichier : ";
        std::cin >> nom_fichier;

        auto lignes = lire_fichier(nom_fichier);
        std::cout << "Voici le contenu du fichier :" << std::endl;
        for (auto const& ligne : lignes)
        {
            std::cout << ligne << std::endl;
        }
        /*****/
    }

    return 0;
}

PS: j’ai rajouté la zone entre /*/

selon moi une fois dans le bloc catch si l’on redemande un nom de fichier et qu’il est de nouveau incorrect on revient dans le bloc catch à nouveau mais mon programme se bloque si je veux rentrer un nouveau nom. Merci d’avance pour les réponses.

+0 -0

Bonjour,

Malheureusement, non, on ne revient pas dans le bloc catch si ce dernier lance quelque chose.

Le catch n’est là que pour traiter l’erreur qui aurait eu lieu dans le bloc try dont il dépend. Si la gestion de ton erreur implique de relancer l’erreur voire d’en lancer une autre, c’est donc normal que le catch laisse filer.

Si tu préfère try/catch c’est un peu comme si tu avais un if/else à chaque instruction où, dans le if tu vérifies qu’il n’y a pas de retour d’erreur et dans le else tu gères le cas d’erreur puis tu sors de la fonction.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte