2012-04-14 12 views
5

A volte, quando sto programmando in C++/C, finisco per chiamare la stessa funzione più volte e mi chiedevo quale sia il modo più efficiente per controllare gli errori per tutte quelle chiamate? L'uso delle istruzioni if else richiede molto codice e sembra brutto. Ho trovato il mio modo di controllare gli errori, forse c'è un modo migliore che dovrei usare.Errore durante il controllo di molte chiamate di funzione

int errs[5] = {0}; 
errs[0] = functiona(...); 
errs[1] = functiona(...); 
... 
errs[5] = functiona(...); 
for (int i = 0; i < 5; i++) 
{ 
    if (err[i] == 0) 
    MAYDAY!_wehaveanerror(); 
} 

Nota: ho capito che l'utilizzo try e catch potrebbe essere migliore per C++ come sarebbe risolvere questo problema un'eccezione al primo errore, ma il problema con questo è che non è compatibile con un sacco di funzioni che restituiscono codici di errore come l'API di Windows. Grazie!

+1

Haha, aggiornato la mia domanda :) – user99545

+2

perché non si vuole sapere il più presto possibile quando si è verificato un errore, e verificare ogni codice di ritorno come si ottiene? Usando il tuo metodo, potresti generare una sequenza di errori e scoprire solo il primo. –

+0

Iterate sulla lista dei parametri che passerete, chiamate la funzione con i parametri di quella iterazione, impostate un bool "abbiamo un errore" su true la prima volta che viene rilevato un errore e terminate il ciclo subito dopo. – DavidO

risposta

2

Se ... Se la funzione ha la possibilità di lanciare un errore diverso si dovrebbe anche aggiungere una cattura tutti.

5

Si potrebbe scrivere un po 'di pseudo-C++ in questo modo:

struct my_exception : public std::exception { 
    my_exception(int); /* ... */ }; 

int main() 
{ 
    try 
    { 
     int e; 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
     if ((e = function()) != SUCCESS) { throw my_exception(e); } 
    } 
    catch (my_exception & e) 
    { 
     std::cerr << "Something went wrong: " << e.what() << "\n"; 
    } 
} 
+0

Oppure è possibile racchiudere la funzione API di Windows con un livello sottile che converte i codici di errore in eccezioni. Borland Delfi l'aveva fatto 15 anni fa, funzionava alla grande e funziona ancora alla grande. –

0

Se si chiama la stessa funzione più e più volte, il modo più succinto potrebbe essere l'uso di una macro. Vorrei suggerire qualcosa di simile:

#define CHECKERROR(x) if(x == 0) wehaveanerror() 

CHECKERROR(function(...)); 
CHECKERROR(function(...)); 

Ovviamente, questa macro sarebbe molto specifico per la particolare funzione di gestore e l'errore in questione, in modo che può essere prudente undef dopo quelle chiamate.

0

Farlo più vecchia scuola, ma mantenendo w/la risposta di errore originale, ma la risposta non appena si verifica un errore w/o cercando brutto:

#define callcheck(r) if ((r)==0) MAYDAY!_wehaveanerror() 

callcheck(functiona(...)); 
callcheck(functiona(...)); 
... 
1

cosa circa la gestione della verifica in una funzione?

void my_function() { 
    if (!create_window()) 
    throw Error("Failed to create window"); 
} 

int main() { 
    try { 
    my_function(); 
    } catch (const Error& e) { 
    cout << e.msg << endl; 
    } catch (...) { 
    cout << "Unknown exception caught\n" 
    } 

    return 0; 
} 
Problemi correlati