Ausnahmenbehandlung in C++



  • ausnahmen schrieb:

    Mir geht es vor allen um so etwas:

    myString.ToDouble(&doubleval);
    myString.ToLong(&longval);
    

    Wenn es nicht passt, soll er diese Werte überspringen und einfach weitermachen.

    Was ist denn jetzt deine Frage? Wenn du die Funktionen implementierst, kannst du darin tun und lassen, was du willst. Wenn du sie nicht implementierst, musst du wohl mit dem Vorgefundenen leben.

    Lars


  • Mod

    Wie wäre es stattdessen mit einem if? Oder der C-Stil mit einem Rückgabewert und errno?



  • Fellhuhn schrieb:

    Mach doch sowas:

    bool ok;
    myString.ToDouble(&doubleval, &ok);
    if (!ok) // fehlerbehandlung
    

    So macht es Qt zB. (bzw die machen das mit Rückgabewert +ok-bool als optionaler Parameter).

    So eine ähnliche Syntax hat wxWidgets, dann wird es wohl exakt dafür gedacht sein.

    if(!myString.ToDouble(&doubleval)
    

    Dann ist es wohl so, dass man bei eigenen Funktionen auf Exceptions zurückgreifen muss um solche Fälle abzufangen? Irgendwo muss ja dieses True oder False ins if zurückgegeben werden oder nicht?

    manni66 schrieb:

    Was ist denn jetzt deine Frage? Wenn du die Funktionen implementierst, kannst du darin tun und lassen, was du willst. Wenn du sie nicht implementierst, musst du wohl mit dem Vorgefundenen leben.
    Lars

    Ich weiß nicht wie man es in C++ handhabt und da ich nur ungern ein eigenes Süppchen koche wollte ich mal nachfragen was so üblich ist wenn mal statt einer double zahl ein sinnloser String eingegeben wird.



  • SeppJ schrieb:

    Wie wäre es stattdessen mit einem if? Oder der C-Stil mit einem Rückgabewert und errno?

    Gilt es dann noch als guter Stil?



  • bool myString::toDouble(double &returnValue)
    {
      if (...) //konvertierung erfolgreich
      { 
        returnValue = // konvertierter wert
        return true;
      }
      return false;
    }
    

    oder

    double myString::toDouble(bool *ok = 0)
    {
      if (...) //konvertierung erfolgreich
      { 
        if (ok) *ok = true;
        return // konvertierter wert
      }
      if (ok) *ok = false;
      return 0.;
    }
    

    oder oder oder...

    hauptsache verständlich, kommentiert und durchgängig bei allen entsprechenden Klassen.


  • Mod

    ausnahmen schrieb:

    SeppJ schrieb:

    Wie wäre es stattdessen mit einem if? Oder der C-Stil mit einem Rückgabewert und errno?

    Gilt es dann noch als guter Stil?

    Es gilt vor allem als umständlich. Wenn es aber die Ausnahme ist und du dadurch nicht ein 10.000 Zeilenprogramm mit 9.000 Zeilen Fehlerbehandlung schreibst, ist das ok.


  • Administrator

    ausnahmen schrieb:

    SeppJ schrieb:

    Wie wäre es stattdessen mit einem if? Oder der C-Stil mit einem Rückgabewert und errno?

    Gilt es dann noch als guter Stil?

    Was ist guter Stil? Wenn es für das Problem mit den gegebenen Möglichkeiten angemessen ist, gewürzt mit ein wenig subjektiver Meinung 😉

    Wie wäre es übrigens mit einem Defaultparameter? Wäre vielleicht dies eher, was du möchtest?

    double convert(std::string const& str, double defaultValue)
    {
      // try to convert str, in case of an error return defaultValue
    }
    
    // ...
    doubleval = convert(myString, 0.0);
    longval = convert(myString, 0L);
    

    Grüssli



  • Fellhuhn schrieb:

    double myString::toDouble(bool *ok = 0)
    {
      if (...) //konvertierung erfolgreich
      { 
        if (ok) *ok = true;
        return // konvertierter wert
      }
      if (ok) *ok = false;
      return 0.;
    }
    

    Wieso Zeiger? 🙂
    Wäre eine Referenz nicht schöner?



  • fasdfadsfsadfasdf schrieb:

    Fellhuhn schrieb:

    double myString::toDouble(bool *ok = 0)
    {
      if (...) //konvertierung erfolgreich
      { 
        if (ok) *ok = true;
        return // konvertierter wert
      }
      if (ok) *ok = false;
      return 0.;
    }
    

    Wieso Zeiger? 🙂
    Wäre eine Referenz nicht schöner?

    Im gegebenen Fall kann man aber den ok-Parameter weglassen, wenn man keinen Fehlerstatus benötigt. Bei Referenzen ginge das nicht ohne weiteres.



  • ausnahmen schrieb:

    Ist es tatsächlich so dass man in C++ die Ausnahmenbehandlung ausschließlich mit Exceptions machen muss?

    Ja. Aber Du kannst Dir viele andere Weisen der Fehlerbehandlung ausdenken.

    ausnahmen schrieb:

    Wenn ich mit assert Arbeite, dann werden diese Assertions doch im Release Modus ungültig?

    Nein. Im Allgemeinen bleiben die Assertions gültig, aber werden nicht mehr überprüft.

    Aber irgendwie weiß ich nicht, was wegoptimiert werden soll.

    bool ok=true;
    double a1=eingabe1.toDouble(&ok);
    if(!ok) goto error;
    double a2=eingabe2.toDouble(&ok);
    if(!ok) goto error;
    double a3=eingabe3.toDouble(&ok);
    if(!ok) goto error;
    double a4=eingabe4.toDouble(&ok);
    if(!ok) goto error;
    double a5=eingabe5.toDouble(&ok);
    if(!ok) goto error;
    rechne();
    return;
    
    error:
    fehler();
    
    try
    {
    double a1=eingabe1.toDouble();
    double a2=eingabe2.toDouble();
    double a3=eingabe3.toDouble();
    double a4=eingabe4.toDouble();
    double a5=eingabe5.toDouble();
    rechne();
    return;
    }
    catch(bool b)
    {
    fehler();
    }
    

Anmelden zum Antworten