2012-04-14 29 views
5

Manchmal, wenn ich in C++/C programmiere ich am Ende die gleiche Funktion mehrmals aufrufen und ich fragte mich, was ist die effizienteste Möglichkeit, für alle diese Anrufe auf Fehler zu prüfen? Verwenden von if else Anweisungen nehmen viel Code auf und sehen hässlich aus. Ich habe meine eigene Art gefunden, nach Fehlern zu suchen, vielleicht gibt es einen besseren Weg, den ich benutzen sollte.Fehler beim Überprüfen vieler Funktionsaufrufe

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(); 
} 

Hinweis: Ich verstehe, dass try und catch Verwendung könnte für C besser ++, wie es dieses Problem durch das Werfen einer Ausnahme auf dem ersten Fehler lösen würde, aber das Problem mit diesem ist, dass es nicht kompatibel mit viel ist von Funktionen, die Fehlercodes wie die Windows-API zurückgeben. Vielen Dank!

+1

Haha, meine Frage aktualisiert :) – user99545

+2

Warum würden Sie nicht so schnell wie möglich wissen wollen, wenn ein Fehler aufgetreten ist, und überprüfen Sie jeden Return-Code, wie Sie es bekommen? Mit Ihrer Methode können Sie eine Reihe von Fehlern generieren und nur über die erste herausfinden. –

+0

Iterieren Sie über die Liste der Parameter, die übergeben werden sollen, rufen Sie die Funktion mit den Parametern dieser Iteration auf, setzen Sie beim ersten Auftreten eines Fehlers ein "wir haben einen Fehler" bool und bestätigen Sie die Schleife dann und dort. – DavidO

Antwort

2

wenn ... Wenn die Funktion eine Chance hat man auch alle einen Haken hinzufügen sollte einen anderen Fehler zu werfen.

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

Sie könnten einige pseudo-C++ wie folgt schreiben:

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

Oder Sie könnten die Windows-API-Funktion mit einer dünnen Schicht umhüllen, die die Fehlercodes in Ausnahmen konvertiert. Borland Delphi hat das vor 15 Jahren gemacht, es hat super funktioniert und funktioniert immer noch großartig. –

0

Wenn Sie die gleiche Funktion über sind aufrufen und immer wieder, die prägnanteste Weise könnte sein, ein Makro zu verwenden. Ich würde vorschlagen, so etwas wie:

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

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

Offensichtlich würde dieser Makro sehr spezifisch für die jeweilige Funktion und Fehlerbehandlung beteiligt, so kann es nach diesen Anrufen zu undef es klug sein.

0

tun es der alten Schule, aber w/der ursprünglichen Fehlerreaktion zu halten, aber sobald ein Fehler auftritt, w/o suchen hässlich reagiert:

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

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

Was über den Umgang mit der Überprüfung in einer Funktion?

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; 
} 
Verwandte Themen