2015-03-20 3 views
5

Sto utilizzando una libreria che fa uso della libreria di registrazione di google per registrare gli errori e controllare l'asserzione con le macro CHECK. Nel mio codice, vorrei rilevare un'eccezione quando le condizioni di CHECK falliscono (ad esempio, quando le applicazioni non riescono ad aprire un file perché non esiste), ma anche usando catch(...) non cattura nulla e il programma si blocca senza controllo.cattura l'eccezione C++ dalle macro CHECK della libreria di registrazione di google

C'è un modo per rilevare l'eccezione quando le macro CHECK falliscono? Oppure, se non è possibile, c'è una soluzione alternativa per gestire queste situazioni?

+0

CHECK è una macro valutata in fase di compilazione o runtime? –

+0

È una macro valutata in runtime (come ASSERT) – gcswoosh

+0

Stai utilizzando il codice Google per gestire le eccezioni ?! –

risposta

0

Come indicato nella official document di glog, è possibile utilizzare

definito dall'utente Failure Function

per sostituire il comportamento predefinito di uscita().

Esempio:

void YourFailureFunction() { 
    throw exception(); 
    } 
    int main(int argc, char* argv[]) { 
    google::InstallFailureFunction(&YourFailureFunction); 
    } 

Tuttavia, la funzione viene richiamata in un distruttore modo che il comportamento potrebbe non essere adatto alle nostre esigenze. Nella mia situazione, la funzione viene chiamata due volte e devo implementare un trucco non troppo bello per evitare che l'eccezione venga lanciata due volte.

bool alreadyThrown = false; 
void YourFailureFunction() { 
    if (!alreadyThrown) 
    { 
     alreadyThrown = true; 
     throw exception(); 
    } 
}