Wie überprüft man, ob eine Funktion richtig ausgeführt wurde?



  • Guten Abend,

    ich lerne im Moment das Programmieren mit C++.
    Kann mir jemand erklären, wie ich Fehler einer Funktion, welche kein int ist, abfange?
    Ich bekomme die Fehlermeldung, dass ein Rückgabewert nicht mit dem Funktionstyp übereinstimmt.

    Mit int funktioniert es so:

    int ReturnCode = meineFunktion(meineVariable);
          if (ReturnCode)
          {
                printf( "Fehler!" );
                return ReturnCode;
          }
    


  • try {
        meineFunktion();
    }
    catch (std::exception &e) {
        std::cerr << e.what() << '\n';
    }
    


  • Danke, ist das eine gute und gängige Methode?
    Was passiert hier?
    was ist &e und e.what?

    catch (std::exception &e) {
        std::cerr << e.what() << '\n';
    }
    


  • MoritzBleibtreu schrieb:

    Danke, ist das eine gute und gängige Methode?

    Ja.

    MoritzBleibtreu schrieb:

    Was passiert hier?
    was ist &e und e.what?

    catch (std::exception &e) {
        std::cerr << e.what() << '\n';
    }
    

    also e ist die exception (ist einfach ein name wie bei variablen). hier mal ein ganzes beispiel:

    #include <iostream>
    
    void meineFunktion(int i)
    {
    	if (i == 0)
    		return;
    	else
    		throw std::exception("fehler! i darf nur 0 sein!");
    }
    
    int main()
    {
    	try {
    		meineFunktion(0); // das hier geht, da i == 0
    		meineFunktion(1); // hier wird eine exception geworfen ...
    	}
    	catch (std::exception &e) { // ... und hier wird diese "gefangen"
    		std::cerr << e.what() << '\n'; // hier kannst du mittels "what()" die fehlermeldung ausgeben
    	}
    }
    


  • exception? schrieb:

    #include <iostream>
    
    void meineFunktion(int i)
    {
    	if (i == 0)
    		return;
    	else
    		throw std::exception("fehler! i darf nur 0 sein!");
    }
    

    ich will ja nicht kleinlich sein, aber std::exception hat keinen solchen Konstruktor.
    Warum machen das so viele in ihren Beispielen?

    Alternative: std::runtime_error. Oder von std::exception ableiten.
    Weitere Standard Exception Klassen kann man hier finden: http://www.cplusplus.com/reference/stdexcept/



  • Tim06TR schrieb:

    ich will ja nicht kleinlich sein, aber std::exception hat keinen solchen Konstruktor.
    Warum machen das so viele in ihren Beispielen?

    Mh, ich meine mich zu erinnern, dass der MSVC dies als Erweiterung hat. Daher ist das dann naheliegend und wenn mans sich angewöhnt ist das schnell mal geschrieben.

    Edit: Jo hat er



  • MoritzBleibtreu schrieb:

    Guten Abend,

    ich lerne im Moment das Programmieren mit C++.
    Kann mir jemand erklären, wie ich Fehler einer Funktion, welche kein int ist, abfange?
    Ich bekomme die Fehlermeldung, dass ein Rückgabewert nicht mit dem Funktionstyp übereinstimmt.

    Mit int funktioniert es so:

    int ReturnCode = meineFunktion(meineVariable);
          if (ReturnCode)
          {
                printf( "Fehler!" );
                return ReturnCode;
          }
    

    Du benutzt in Deinem Beispiel eine von Dir selbst geschriebene Funktion.
    Wenn es also um Funktionen geht, die Du selbst entwickelst, dann bestimmst Du ganz alleine, ob die überhaupt fehlerhaft sein kann, und wenn, dann auf welche Weise sie Ihre Fehler an einen Aufrufer zurückgibt.
    Es hindert Dich ja niemand daran, die Funktion mit einem int als Rückgabewert zu definieren.
    Sollte es um andere Funktionen gehen, also solche, die nicht von Dir geschrieben sind, musst Du recherchieren, ob diese überhaupt fehlerhaft sein können, und ob bzw. wie sie einen Fehler an den Aufrufer übermitteln würden.
    Der schönste try/catch - Block nützt nicht viel, wenn die Funktion überhaupt keine Exception wirft.
    Du solltest Dir als blutiger Anfänger da im Moment wahrscheinlich nicht ganz so viele Gedanken drüber machen.
    Versuch zunächst mal, Deine eigenen Funktionen so zu schreiben, dass sie gar nicht fehlerhaft sein können, falls das nicht geht, sie nur mit Parametern aufzurufen, die keine Fehler auslösen.
    Mit fortschreitendem Lernerfolg wirst Du dann irgendwann ganz von selbst auf Lösungen und Strategien stoßen, das geschilderte Problem zu lösen.


Anmelden zum Antworten