Domanda

Il seguente catch () non viene chiamato:

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

C'è un modo per cogliere questo tipo di eccezione?

È stato utile?

Soluzione

Controlla http://linux.die.net/man/1/gcc c'è un'opzione del compilatore -mcheck-zero-division per gestire questo.

In alternativa, l'installazione di un gestore SIGFPE potrebbe essere un'opzione,  Un div float per 0 genererebbe quindi un 'FPE_ZERODIVIDE'

         signal(SIGFPE, (fptr) FPE_ExceptionHandler);

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

            }

da

La maggior parte dei sistemi a virgola mobile si basano sullo standard IEEE, che consente la divisione per 0. Ciò restituisce l'infinito positivo o l'infinito negativo in base ai segni dei numeri. (Tranne 0/0 restituisce il NAN indefinito - di nuovo non un caso eccezionale.) Questo tende ad essere utile per applicazioni scientifiche e matematiche. Le NAN segnalano efficacemente un caso in cui i calcoli non erano prevedibili ma consentono i calcoli per continuare. I calcoli continuati non produrranno nuovi risultati ma continueranno a restituire NAN. Ciò consente di eseguire lunghe e lunghe catene di calcoli senza controllo degli errori all'interno del calcolo. I controlli degli errori devono essere eseguiti solo alla fine del lavoro. Questo rende il codice molto più semplice e anche più veloce. Può anche essere più utile a volte come per alcune applicazioni, l'infintity è un "utile" risultato, non proprio un segno di problemi.

Altri suggerimenti

No - non viene generata alcuna eccezione (viene visualizzato un segnale, probabilmente SIGFPE). È necessario verificare la possibile divisione per zeri nel codice e quindi generare un'eccezione,

Se questo causa un errore di runtime (vedi bella discussione di lakshmanaraj sulla matematica IEEE , anche se alcuni compilatori ti permetteranno di forzare errori invece di NaN), genera un'eccezione in virgola mobile signal .

I segnali sono un meccanismo diverso rispetto alle eccezioni c ++ e sono gestiti a livello di sistema operativo. Esistono già alcune domande SO relative al meccanismo del segnale * nix, tra cui:

Per Windows, dovrai chiedere a qualcun altro. Mac OS X è - ovviamente - un sistema derivato unix.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top