Come posso rilevare le eccezioni a livello di sistema in Linux C ++?
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?
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.