Wie Rückgabewert und Fehlercode?



  • Hallo,
    ich habe eine Funktion bei der ich einmal einen Wert und einen Fehlercode zurückgeben möchte.
    Z.B. Funktion ohne Fehlercode:

    int getInteger(const std::string &name)
    

    Wenn in der Funktion ein Fehler auftritt (z.B. name nicht bekannt) soll ein Fehlercode zurückgegeben werden.

    Version 1:
    Übergabe eines Zeigers in dem der Fehlercode gespeichert wird.

    int getInteger(const std::string &name, int *errCode)
    

    Version 2:
    Fehlercode ist Rückgabewert, Wertrückgabe per Zeiger

    int getInteger(const std::string &name, int *ret)
    

    Version 3:
    Extra Funktion die den Fehlercode des letzten Aufrufs abfragt

    int getInteger(const std::string &name)
    int getLastError()
    

    Persönlich würde ich Version 2 nehmen, da man dann sowas wie:

    if (errCode = getInteger("temperatur_1", &wert))
    {
      cout << "OK, Wert: " << wert << endl;
    }
    else
    {
      cout << "Fehler, Fehlercode: " << errCode << endl;
    }
    

    schreiben kann.

    Was ist die übliche Vorgehensweise bei solchen Fällen?

    Gruß
    Thomas



  • Zuerst verweise ich auf http://www.c-plusplus.net/forum/viewtopic-var-t-is-235778.html . Ist ne Menge, lohnt vielleicht.

    Version 3 ist meines Erachtens des beste Weg fuer Fehlercodes, analog zu perror ind den meisten C-Programmen. OpenGL nutzt sowas aehnliches. Ausserdem brauchst du dann keinen Fehlercode zurueckgeben sondern kannst den Rueckgabeparameter wie gehabt benutzen. Versaut nicht die Signatur der Funktion.



  • Version 4: Exception.

    Wenn du dich nicht mit der mühsamen Diskussion im verlinkten Thread herumschlagen willst, kannst dir dieser Artikel eine Einführung in Exception-Handling in C++ geben. Um weiterführendes Wissen zu erlangen, helfen dir der erste und der zweite Teil des Artikels von Shade Of Mine.



  • Erstmal danke für die Links.
    Mit den Exceptions hört sich ja schonmal gut an, allerdings weiß ich nicht ob ich das für meine Anwendung nutzen kann.

    Mein Programm soll Anfragen über XML-RPC beantworten. Wenn also eine Anfrage nach Wert von xy kommt und die Variable mit diesem Namen vorhanden ist, dann wird nur der Wert zurückgesendet.
    Wenn die Variable mit dem Namen aber nicht vorhanden ist, wird nur der Fehlercode (bzw. Grund) zurückgesendet. Das Programm soll jedoch normal weiterlaufen.

    Bei der GetLastError() Variante frage ich, wie sowas gelöst wird wenn ein Programm in mehreren Threads läuft.



  • Thomas_123 schrieb:

    Erstmal danke für die Links.
    Mit den Exceptions hört sich ja schonmal gut an, allerdings weiß ich nicht ob ich das für meine Anwendung nutzen kann.

    du kannst.

    Thomas_123 schrieb:

    Mein Programm soll Anfragen über XML-RPC beantworten. Wenn also eine Anfrage nach Wert von xy kommt und die Variable mit diesem Namen vorhanden ist, dann wird nur der Wert zurückgesendet.
    Wenn die Variable mit dem Namen aber nicht vorhanden ist, wird nur der Fehlercode (bzw. Grund) zurückgesendet. Das Programm soll jedoch normal weiterlaufen.

    void bearbeiteANfrage(){
       try{
       }
       catch(Exception& e){
          sendeFehlerANtwort(ex.why());
       }
    }
    

    oder so.
    also pro anfrage ein try-catch, und nicht erst in der main() fangen und dem armen serveradmin sagen.

    [cpp]Bei der GetLastError() Variante frage ich, wie sowas gelöst wird wenn ein Programm in mehreren Threads läuft.[/quote]
    geh davon aus, daß GetLastError() threadlokal funktioniert. sonst wär's ja müll.



  • Version 5:
    Etwas vom Typ std::pair<int, std::string> zurückgeben. Aber wirklich nur, wenn es unbedingt sein muss, ich persönlich finde solche Konstrukte eher unschön.


Log in to reply