Question

Le catch () suivant n'est pas appelé:

void test(void)
{
    int i=1,j=0,k;
    try
    {
        k = i/j;
    }
    catch(...)
    {
        ...handle it...
    }
}

Y a-t-il un moyen d'attraper ce type d'exception?

Était-ce utile?

La solution

Veuillez vérifier http://linux.die.net/man/1/gcc il existe une option de compilation -mcheck-zero-division pour gérer cela.

Vous pouvez également installer un gestionnaire SIGFPE,  Un flottant div par 0 générerait alors un 'FPE_ZERODIVIDE'

         signal(SIGFPE, (fptr) FPE_ExceptionHandler);

         void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/)
          {
                switch(nErrType)
                  {
                    case FPE_ZERODIVIDE:  /* ??? */ break;
                }

            }

depuis

La plupart des systèmes à virgule flottante sont basés sur le standard IEEE, ce qui permet une division par 0. Cela renvoie l'infini positif ou l'infini négatif, selon le cas, en fonction des signes des nombres. (Sauf que 0/0 renvoie le NAN non défini - encore une fois, ce n'est pas un cas exceptionnel.) Cela a tendance à être utile pour les applications scientifiques et mathématiques. Les réseaux NAN signalent effectivement un cas où les calculs n'étaient pas possibles mais permettaient aux calculs de continuer. Les calculs en cours ne produiront pas de nouveaux résultats, mais continueront à renvoyer les NAN. Cela permet d'effectuer de longues chaînes de calculs sans vérification d'erreur dans le calcul. Les vérifications d'erreur ne doivent être effectuées qu'à la toute fin du travail. Cela rend le code beaucoup plus simple et plus rapide. Cela peut aussi être plus utile parfois que pour certaines applications, l’intimité est une option "utile". résultat, pas vraiment un signe de problèmes.

Autres conseils

Non, aucune exception n'a été émise (vous recevez un signal - probablement SIGFPE). Vous devez vérifier les divisions possibles par zéros dans votre code, puis émettre une exception vous-même,

Si cela provoque une erreur d'exécution (voir La bonne discussion de lakshmanaraj sur les mathématiques IEEE , bien qu'un compilateur vous permette de forcer des erreurs à la place de NaN), il jette une signal . d'exception à virgule flottante.

Les signaux sont un mécanisme différent des exceptions c ++ et sont gérés au niveau du système d'exploitation. Il existe déjà un certain nombre de questions SO concernant le mécanisme de signal * nix, notamment:

Pour Windows, vous devrez demander à quelqu'un d'autre. Mac OS X est - bien entendu - un système dérivé de Unix.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top