Maison > développement back-end > C++ > Pourquoi C ne lève-t-il pas d'exceptions pour la division entière par zéro et comment pouvons-nous la gérer ?

Pourquoi C ne lève-t-il pas d'exceptions pour la division entière par zéro et comment pouvons-nous la gérer ?

DDD
Libérer: 2024-12-14 17:20:12
original
322 Les gens l'ont consulté

Why Doesn't C   Throw Exceptions for Integer Division by Zero, and How Can We Handle It?

Capture de la division d'exécution par zéro exception

Énoncé du problème

Dans l'extrait de code donné, la division par zéro ne déclenche pas d'exception. Pourquoi est-ce le cas et comment pouvons-nous garantir que des exceptions sont levées pour de telles erreurs ?

Explication

Contrairement à d'autres erreurs d'exécution courantes, la division entière par zéro n'est pas une exception dans la norme C . Les opérations de division ou de reste en virgule flottante ne génèrent pas non plus d'exceptions en soi. Au lieu de cela, ces opérations ont un comportement indéfini lorsque le deuxième opérande est zéro. Cela signifie que le système pourrait potentiellement se comporter de manière imprévisible, notamment en lançant des exceptions, en faisant planter le programme ou même en effectuant des actions en dehors de la portée du programme.

Lancement d'exceptions personnalisées

Étant donné que le standard C ne gère pas division par zéro à titre d'exception, les développeurs doivent vérifier manuellement ces conditions et lancer des exceptions personnalisées si nécessaire. Par exemple, on pourrait lancer une erreur overflow_error ou une domain_error pour indiquer une erreur de division par zéro.

Exemple de code

L'extrait de code modifié suivant montre comment intercepter la division par zéro exceptions à l'aide d'un intDivEx personnalisé fonction :

#include <iostream>
#include <stdexcept>

// Integer division, catching divide by zero.
inline int intDivEx(int numerator, int denominator) {
    if (denominator == 0)
        throw std::overflow_error("Divide by zero exception");
    return numerator / denominator;
}

int main() {
    int i = 42;

    try {
        i = intDivEx(10, 0);
    } catch (std::overflow_error &amp;e) {
        std::cout << e.what() << " -> " << i << std::endl;
    }
    std::cout << i << std::endl;

    try {
        i = intDivEx(10, 2);
    } catch (std::overflow_error &amp;e) {
        std::cout << e.what() << " -> " << i << std::endl;
    }
    std::cout << i << std::endl;

    return 0;
}
Copier après la connexion

Sortie :

Divide by zero exception -> 42
5
Copier après la connexion

Ce code correctement lance et attrape la division par zéro exception, en préservant la valeur originale de i.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal