Quels sont quelques exemples derreurs dexécution en C ++?


Meilleure réponse

Il existe deux définitions possibles:

In conditions générales ,

Une erreur dexécution est une opération non valide qui se produit pendant lexécution dun programme qui, au moment de la compilation, ne peut pas être détectée.

Par exemple, considérez ceci

#incude

int main()

{

int a=0, b=0;

std::cout << "getting the quotient. \n Two numbers, please" << std::endl;

std::cin >> a >> b;

auto z = a/b;

std::cout << "the quotient is" << z << std::endl;

}

Ce programme est "bien formé": le compilateur peut le traduire avec succès et le système dexploitation lexécute avec succès.

Et si vous tapez deux entiers séparés par des espaces lorsque nécessaire, il affiche le quotient intégral comme il est censé le faire.

Mais, si vous tapez "0" comme deuxième nombre, ou si vous tapez quelque chose comme quelque chose qui t nest pas un nombre ou ne peut pas être analysé comme un nombre, vous vous retrouverez avec une division entière par 0. Quelque chose que le CPU ne peut pas faire et pour lequel un signal dinterruption est émis en attendant que quelque chose y réagisse. (La réaction standard du système dexploitation est de transmettre le signal au programme, où le gestionnaire de signal par défaut CRT appelle «terminate ()».

In C ++ spécifique terme : une erreur dexécution est une instance de nimporte quelle classe dérivée de std::runtime\_error donnée à une instruction throw .

Quelle que soit la fonction qui découvre une opération qui ne peut pas être effectuée comme prévu, elle doit lancer une exception comme celle-là, pour permettre à lappelant de gérer lerreur.

Maintenant, essayons dêtre plus «doux»:

#include

#include

#include

class divide\_by\_zero: public std::runtime\_error

{ public: using std::runtime\_error::runtime\_error; };

// filter a divide by zero runtime error

auto div(int a, int b)

{

if(!b)

{ throw divide\_by\_zero("attempt to divide by zero"); }

return a/b;

}

// clear a stream status, and discard input up to a "\n"

void discard\_input(std::istream& s)

{

s.clear();

s.ignore(std::numeric\_limits::max(),"\n");

}

int main()

{

for(;;)

{

try

{

int a=0; b=0;

std::cout << "Getting the quotient: Two numbers, please" << std::endl;

std::cin >> a >> b;

auto z = div(a,b);

std::cout << "The quotient is " << z << std::endl;

return 0;

}

catch(std::exception& e) //whatever exception

{

std::cout << "Error in computation: " << e.what() << "\n";

std::cout << "Bad input - retry!" << std::endl;

discard\_input(std::cin);

}

}

}

Vous pouvez voir la fonction div effectuant réellement la division. Il peut filtrer le cas du diviseur «0», mais ne peut pas corriger le problème par lui-même (il na aucune idée de «pourquoi» le diviseur est 0, il ne peut donc pas entreprendre daction spécifique: il «rapporte» son échec sous la forme dun exception.

Lancien main, est maintenant à lintérieur dun bloc try . Si aucune exception nest levée, il se comporte comme le précédent.

Si une exception est levée, la portée est quittée, mais le bloc catch affichera un message dinformation, nettoiera la «mauvaise entrée» (il réinitialise les indicateurs détat - donc en supprimant le bit de fail dans létat cin , puis dignorer les «caractères stupides» jusquà un point raisonnable - le \ n suivant) et laissez la boucle dencapsulation se ré-exécuter.

Réponse

Les erreurs dexécution sont des erreurs qui se produisent lorsque le programme est en cours dexécution. Elles peuvent être de différents types, notamment:

  • Erreurs logiques: lorsque le programme génère une sortie différente de la sortie attendue. Par exemple, vous créez un programme pour ajouter deux nombres, mais vous donnez par erreur un signe - au lieu du signe +.
  • Fuites de mémoire: les programmes utilisent continuellement de la RAM et empêchent les emplacements de mémoire dêtre utilisés une seule fois pour dautres tâches leur travail est terminé. Exécuter des boucles infinies ou ne pas désallouer la mémoire utilisée peut les causer.
  • Crashes: Ils peuvent être dus à de nombreuses raisons telles que:
  • Référencer des fichiers manquants Vous voulez afficher une image mais vous lui indiquez le mauvais chemin, le programme ne la trouvera pas et plantera.
  • Diviser les choses par zéro. Nous disons simplement que tout ce qui est divisé par 0 nest pas défini. Les programmes ne sont pas si intelligents et se détraquent.
  • Donner une mauvaise entrée. Avez-vous déjà essayé de saisir un caractère dans une variable entière pendant lexécution du programme? Si oui, vous savez ce qui se passe.etc.

Jespère que cela a aidé…

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *