40 votes

Pourquoi le bloc Try-Catch affecte-t-il une variable dans une portée englobante?

Pourquoi le temp externe devient-il vide après avoir détecté la première exception?

 #include <iostream>
int main()
{
    std::string temp("exception");
    int value;
    while(std::cin>> value && value != 0)
    {
         try{
              if(value > 9) throw temp;
              else std::cout << value << "\n";
            }
         catch(std::string temp)
         {
              std::cout << temp << "\n";
         }
    }

    return 0;
}

Contribution:

 1
2
11
13

Production:

 1
2
exception
// Printing Empty string

Production attendue:

 1
2
exception
exception

Je compile mon code avec g ++ 7.3.0.

-11voto

Manoj Points 453

Je ne sais pas s'il s'agit d'un bogue ou non, comme mentionné dans une autre réponse, mais le bloc catch change / omet le contenu de temp après avoir traité l'exception une fois. Le code ci-dessous résout ce problème. Faites le temp a const pour résoudre ce problème.

 #include <iostream>
    int main()
    {
        const std::string temp("exception");
        int value;
        while(std::cin>> value && value != 0)
        {
             try{
                  if(value > 9) throw temp;
                  else std::cout << value << "\n";
                }
             catch(std::string temp){
                  std::cerr << temp << "\n";
                  }
        }

        return 0;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X