Fehlerüberprüfung bei cout?



  • Hi,

    für die Schule schreibe ich gerade ein Programm unter Linux.
    Unser Lehrer will, dass wir alle Rückgabewerte - auch printf - überprüfen.
    Nun verwende ich aber nicht printf, sondern iostream.
    Wie kann ich überprüfen, ob bei einem Code wie

    cout << "Ein String";
    

    ein Fehler aufgetreten ist?

    Geht das mit .fail()?
    Ich kann es leider nicht ausprobieren, da mir keine Situation einfällt wo die Ausgabe auf der Konsole fehlschlagen könnte.

    Kann ich mit cout.fail() alle Fehlerfälle abfangen, genauso wie man mit printf()<0 ?

    mfg. Tubos



  • Exceptions fangen?

    Bye, TGGC (Fakten)



  • Hallo,

    Geht das mit .fail()?

    Ja.

    Ich kann es leider nicht ausprobieren, da mir keine Situation einfällt wo die Ausgabe auf der Konsole fehlschlagen könnte.

    cout ist auch nur ein Stream, er könnte aber genausogut eine zum Schreiben geöffnete Datei sein. Sagen wir mal, du darfst z.B. nicht schreiben, weil du keine Rechte besitzt, dann kannst du das abfragen.

    TGGC schrieb:

    Exceptions fangen?

    Auf good() prüfen müsste es auch tun.

    MfG

    GPC



  • Ok.

    fail() ist aber nicht dasselbe wie !good(), hab ich gelesen.
    good überprüft mehr.
    Das heißt ich sollte good() verwenden. Richtig?

    Exceptions will ich nicht verwenden, sonst tut sich mein Lehrer schwer das Programm zu verstehen.



  • fail() ist aber nicht dasselbe wie !good(), hab ich gelesen.

    Stimmt.

    good überprüft mehr.

    good() prüft auf fail(), bad() und eof(). Deckt so ziemlich alles ab 😉

    Das heißt ich sollte good() verwenden. Richtig?

    Richtig.

    MfG

    GPC



  • Und wie willst du solch einen Fehler behandeln?^^



  • if(std::cout << "Ausgabe" << std::endl)
        return true;
    else
        return false;
    

    Where's da problem?



  • ceplusplus schrieb:

    if(std::cout << "Ausgabe" << std::endl)
        return true;
    else
        return false;
    

    Where's da problem?

    lol.



  • aber man muss dem user des programms doch auch irgendwie den fehler melden^^



  • *nachdenkt*:

    if(std::cout << "Ausgabe" << std::endl) 
        if(std::cout << "Ausgabe ok!" << std::endl)
            if(std::cout << "Ausgabe ok ok!" << std::endl)
    

    Ihr habt ja recht, das war nicht optimal 🤡



  • Haha, darüber hab ich auch schon gerätselt 😃
    Die Lösung ist aber einfach: statt auf stdout auf stderr ausgeben.
    Oder in C++: Statt cout cerr.

    @ceplusplus: Der << Operator gibt keinen bool, sondern eine Referenz auf den Stream zurück. Der Returnwert hat keine Aussagekraft.
    (Wenn ich das Ganze richtig verstanden habe).

    Danke für die HIlfe!



  • Die Lösung ist aber einfach: statt auf stdout auf stderr ausgeben.

    Und wenn das auch fehlschlägt?



  • Dann beende ich einfach das Programm.

    So eine gute Fehlerüberprüfung hat aber nichtmal das Programm meines Lehrers 😉



  • wenn cerr auch fehlschlägt, dann startest du deine kleine kernelhacking routine, die alle an das system angeschlossenen ausgabegeräte abcheckt. und wenn davon keins funktioniert, dann morst du die ausgabe per blinkender scroll-lock led.



  • fehlerbehandler schrieb:

    wenn cerr auch fehlschlägt, dann startest du deine kleine kernelhacking routine, die alle an das system angeschlossenen ausgabegeräte abcheckt. und wenn davon keins funktioniert, dann morst du die ausgabe per blinkender scroll-lock led.

    🤡



  • fehlerbehandler schrieb:

    wenn cerr auch fehlschlägt, dann startest du deine kleine kernelhacking routine, die alle an das system angeschlossenen ausgabegeräte abcheckt. und wenn davon keins funktioniert, dann morst du die ausgabe per blinkender scroll-lock led.

    nice ^^
    post doch mal den quellcode der kernelhacking routine, dann bekommst auch ein keks von mir 🙂



  • Anders als ich zuvor behauptet habe, müsste
    if (!(cout << "test))
    funktionieren. Denn mit cin geht es ja auch.

    edit:
    Ich glaube ich verwende jetzt doch die oben angegebene Syntax. Das sollte laut der C++ FAQ light auch funktionieren:

    The operator void*() cast operator returns some non-NULL pointer if the stream is in a good state, or NULL if it's in a failed state.

    (http://www.parashift.com/c++-faq-lite/input-output.html).
    Oder kann mir jemand einen Grund sagen wieso es nicht funktionieren sollte?



  • keksmann schrieb:

    fehlerbehandler schrieb:

    wenn cerr auch fehlschlägt, dann startest du deine kleine kernelhacking routine, die alle an das system angeschlossenen ausgabegeräte abcheckt. und wenn davon keins funktioniert, dann morst du die ausgabe per blinkender scroll-lock led.

    nice ^^
    post doch mal den quellcode der kernelhacking routine, dann bekommst auch ein keks von mir 🙂

    klar, das geht so:

    int main(){float *f;f = (float*)malloc(sizeof(double));*f = M_PI;*(++f) = M_PI;--f;void *v;v = f;double *d;d = (double*)v;}
    

    (sorry, was beknackteres is mir auf die schnelle nich eingefallen ;))


Anmelden zum Antworten