This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in202:seance_4a:td_4a:part_i [2021/04/11 13:34] bmonsuez [Liens vers les éléments syntaxiques C++] |
in202:seance_4a:td_4a:part_i [2022/11/18 10:46] (current) |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Les exceptions en C++ ====== | ====== Les exceptions en C++ ====== | ||
+ | |||
+ | ==== Question n°1 : Lancer & capturer un exception ==== | ||
+ | |||
+ | Exécuter le code suivant et observer les messages en fonction | ||
+ | des arguments. | ||
+ | |||
+ | <code cpp> | ||
+ | |||
+ | #include<iostream> | ||
+ | |||
+ | double divide(double a, double b); | ||
+ | void test_divide(); | ||
+ | |||
+ | double divide(double a, double b) | ||
+ | { | ||
+ | try { | ||
+ | if(!b) throw b; | ||
+ | } | ||
+ | catch (double b) { | ||
+ | std::cout << "Ne peut pas diviser par zero.\n"; | ||
+ | return b; | ||
+ | } | ||
+ | return a/b; | ||
+ | } | ||
+ | |||
+ | void test_divide() | ||
+ | { | ||
+ | double i, j; | ||
+ | for(;;) { | ||
+ | std::cout << "Le numerateur (0 pour arreter): "; | ||
+ | std::cin >> i; | ||
+ | if(i == 0) | ||
+ | break; | ||
+ | std::cout << " Le denominateur : "; | ||
+ | std::cin >> j; | ||
+ | std::cout << "Resultat: " << divide(i,j) << std::endl; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | test_divide() ; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Expliquer ce qui se passe. | ||
+ | |||
+ | ==== Question n°2 : Création d'une classe d'exception ==== | ||
+ | |||
+ | Nous envisageons désormais faire les choses correctement. Nous souhaitons définir une classe exception qui dérive de la classe [[https://en.cppreference.com/w/cpp/error/logic_error|''std::logic_error'']]. | ||
+ | |||
+ | Cette classe devra s’appeler ''division_by_zero''. | ||
+ | |||
+ | === Question n°2.1 === | ||
+ | |||
+ | Créer la classe ''division_by_zero''. Elle pourra être définie dans un fichier d’entête ''math.hpp'' qui contiendra aussi l’entête de la fonction ''divide''. Le fichier associé ''math.cpp'' contiendre la code de la fonction divide. | ||
+ | |||
+ | Penser à fournir un message d’erreur cohérent. | ||
+ | |||
+ | === Question n°2.2 === | ||
+ | |||
+ | Modifier les fonctions divide et test_divide pour prendre ne plus lancer et capturer une exception de type double mais de type ''division_by_zero''. | ||
+ | |||
+ | |||
+ | |||
+ | |||
==== Liens vers les éléments syntaxiques C++ ==== | ==== Liens vers les éléments syntaxiques C++ ==== |