2012-04-14 20 views
5

A veces, cuando estoy programando en C++/C, termino llamando a la misma función varias veces y me pregunto ¿cuál es la forma más eficiente de verificar si hay errores para todas esas llamadas? Usar las declaraciones if else toma mucho código y se ve feo. He encontrado mi propia forma de verificar errores, quizás haya una mejor manera de usar.Error al verificar muchas llamadas a funciones

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: Tengo entendido que el uso de try y catch podría ser mejor para C++, ya que podría resolver este problema lanzando una excepción en el primer error, pero el problema con esto es que no es compatible con una gran cantidad de funciones que devuelven códigos de error como la API de Windows. ¡Gracias!

+1

Jaja, actualizado mi pregunta :) – user99545

+2

¿Por qué no le gustaría saber tan pronto como sea posible cuando se produce un error, y comprobar cada código de retorno que se obtiene? Usando su método, podría generar una secuencia de errores, y solo descubrir el primero. –

+0

Revise la lista de parámetros que aprobará, llame a la función con los parámetros de esa iteración, establezca un bool "tenemos un error" en verdadero la primera vez que se detecte un error, y termine el ciclo en ese momento. – DavidO

Respuesta

2

si ... si la función tiene la oportunidad de lanzar un error diferente que también debe añadir una captura de todo.

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"; 
    } 
    catch (...) 
    { 
     //Error Checking 
    } 
} 
5

Se puede escribir algunos pseudo-C++ así:

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

O podría envolver la función API de Windows con una capa delgada que convierta los códigos de error en excepciones. Borland Delphi había hecho esto hace 15 años, funcionó de maravilla y aún funciona de maravilla. –

0

Si llama a la misma función una y otra vez, la forma más breve podría ser utilizar una macro. Yo sugeriría algo así como:

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

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

Obviamente, esta macro sería muy específico al controlador de función y de error implicado en particular, por lo que puede ser prudente undef después de esas llamadas.

0

Hacerlo más de la vieja escuela, pero manteniendo w/la respuesta de error original, sino responder tan pronto como se produce un error w/o feo:

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

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

¿Qué pasa con el manejo de la comprobación de una función?

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; 
} 
Cuestiones relacionadas