C++ : Rattraper une erreur de division par zéro

Ici est un simple morceau de code où une division par zéro se produit. Je suis en train d'essayer de l'attraper :

#include <iostream>

int main(int argc, char *argv[]) {
    int Dividend = 10;
    int Divisor = 0;

    try {
        std::cout << Dividend / Divisor;
    } catch(...) {
        std::cout << "Error.";
    }
    return 0;
}

Mais l'application se bloque de toute façon (même si j'ai mis l'option -fexceptions de MinGW).

Est-il possible de prendre une telle exception (que je comprends, c'est pas une des exceptions C++, mais un FPU exception) ?

Je suis conscient que je pourrais consulter pour le diviseur avant la division, mais j'ai fait l'hypothèse que, parce qu'une division par zéro est rare (au moins dans mon application), il serait plus efficace d'essayer de la division (et la capture de l'erreur si elle se produit) que de tester à chaque fois le diviseur avant de se diviser.

Je suis en train de faire ces tests sur un WindowsXP ordinateur, mais vous souhaiteriez en faire de la croix-plate-forme.

  • if (Divisor == 0) { std::cout << "Error."; exit; }. Vous ensuite d'éliminer toute cause de ce qui se passe. Ensuite, vous pouvez supprimer le conditionnel et l'expédition de votre produit avec pas de division par des zéros.
  • (Un assert(Divisor != 0) serait plus canonique. N'oubliez pas de développer en cours d'exécution à travers un débogueur!)
  • Ce n'est même pas un FPU exception, mais le CPU exception. FPU poignées de nombres à virgule flottante, mais vous obtiendrez NaN ou l'infini, avec elle, pas un plantage.
  • Règle de base: TOUJOURS (et dans le cas où vous avez manqué l'accent: TOUJOURS!) vérifiez vos informations avant de faire les calculs et vous éviter ces types de problèmes.
  • "J'ai fait l'hypothèse que, parce qu'une division par zéro est rare (au moins dans mon application), il serait plus efficace" - alors il ne faut pas faire de telles hypothèses avant d'exécuter le générateur de profils. Faire des hypothèses sur le bleu est une façon d'échouer lors de l'optimisation. Faites confiance à votre optimiseur et votre CPU de la direction de la prévision.
  • Java n'a pas de problème: ideone.com/Ro5mw3. C'est probablement les tests à chaque diviseur avant de passer à la CPU.

InformationsquelleAutor Jérôme | 2011-01-20