Maison >développement back-end >C++ >Pourquoi C ne lève-t-il pas d'exception pour la division entière par zéro ?
Attraper les exceptions Divide-by-Zero
Malgré les tentatives d'interception d'une exception à l'aide d'un bloc try/catch, le code suivant contourne inexplicablement le exception lors de la division par zéro :
int i = 0; cin >> i; // input validation not present try { i = 5/i; } catch (std::logic_error e) { cerr << e.what(); }
Gestion des exceptions en C
Contrairement aux attentes, la division entière par zéro n'est pas une exception intégrée au standard C . Cela est également vrai pour la division/reste en virgule flottante par zéro, bien que dans ce cas, des valeurs rationnelles spécifiques telles que NaN/Inf puissent en résulter.
La liste des exceptions définies dans la norme ISO C 20 comprend :
logic_error domain_error invalid_argument length_error out_of_range runtime_error range_error overflow_error underflow_error
Bien que des arguments puissent être avancés en faveur de l'utilisation de overflow_error ou domain_error pour indiquer une division par zéro, la norme indique explicitement que le comportement n'est pas défini dans de tels cas.
Gestion personnalisée des exceptions
Si une exception de division par zéro est souhaitée, elle peut être implémentée manuellement. L'exemple suivant utilise la fonction intDivEx pour diviser des entiers avec gestion des exceptions :
inline int intDivEx (int numerator, int denominator) { if (denominator == 0) throw std::overflow_error("Divide by zero exception"); return numerator / denominator; }
Le résultat de l'utilisation de cette fonction démontre l'exception levée et interceptée, laissant la variable d'origine intacte dans le cas d'une division par -zéro :
i = intDivEx(10, 0); // throws exception i = intDivEx(10, 2); // returns 5
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!