Anfängerfrage zu CException



  • Hallo,
    bitte nicht lachen, ich hab ne ganz blöde Frage...
    Ich habe eine eigene Klasse CCustomException von CException abgeleitet,
    um damit ein Errorprotokoll zu schreiben. Wird ein Fehler ausgelöst, kommt über die AddErrorToList ein neuer Error ins File. Funktioniert ja alles einwandfrei, ist mir aber völlig unlogisch.
    Ich kann die ohnehin als public deklarierte Methode AddErrorToList doch genauso auch schon in der if-Schleife des try-Blocks machen?
    Wozu also noch das catch?
    Ist da das Beispiel, nachdem ich das gemacht habe, einfach mistig, oder versteh ich da was falsch?

    try
    	{
    		if (// Irgendwas geht schief)
    		{
    		     CString Error;
    		     throw(Error);
                    }
    	} 
    	catch(CString _Error)
    	{
    		// Zu Debugzwecken... Ausgabe des Errors in MessageBox
    		AfxMessageBox(_Error);
    		CCustomException Exception;
                    Exception.AddErrorToList(_Error);
    	}
    

    Im Voraus schon mal besten Dank
    der Unwissende Squeegee 😃



  • Klar geht das auch.

    Aber wie wäre es mit sowas:

    try
    {
    IstDieseEingabeOkay();
    JeneAuch();
    UndUeberhaupt();
    // mach das, was im Falle von "kein Fehler" gemacht werden soll
    }
    catch (...)
    {
    //...
    }
    

    Da wird von innerhalb der Funktionen geworfen, das ist schön übersichtlich.
    Du kannst sowas dann auch in deine eigenen Klassen einbauen und die selber Prüfen lassen.

    Klar kann man mit Rückgabewerten und vielen ifs das Selbe erreichen. Ist aber nicht so schön übersichtlich.



  • erste regel bei exceptions: alles was schief gehen kann so früh wie möglich machen!

    p.s. es gibt keine if - schleifen 😉



  • @estartu_de:
    nochmal nachfragen, ob ich das richtig verstanden habe:
    throw ist praktisch, wie wenn ich einen Interrupt auslöse (ich komme eigentlich auch der µP-Programmierung). Innerhalb der IstDieseEingabeOkay() oder irgendeiner anderen Methode hab ich also über eine if-Anweisung was abgefangen, werfe dort, er springt sofort in den catch-Teil, führt diesen auf und springt dann an die nächste Anweisung nach dem throw?

    @Psycho:
    Upps, gemeint war natürlich ne If-Anweisung...

    Gruß und Dank Squeegee

    Ähem... Ich glaub eher er springt dann ans Ende der Catch, oder?



  • springt dann an die nächste Anweisung nach dem throw?

    nein.



  • Squeegee schrieb:

    @estartu_de:
    nochmal nachfragen, ob ich das richtig verstanden habe:
    throw ist praktisch, wie wenn ich einen Interrupt auslöse (ich komme eigentlich auch der µP-Programmierung). Innerhalb der IstDieseEingabeOkay() oder irgendeiner anderen Methode hab ich also über eine if-Anweisung was abgefangen, werfe dort, er springt sofort in den catch-Teil, führt diesen auf und springt dann an die nächste Anweisung nach dem throw?

    Ähem... Ich glaub eher er springt dann ans Ende der Catch, oder?

    Assembler-Programmierung ist lange her, aber ich denke, man kann das vergleichen.
    Sobald etwas geworfen wird, springt der SOFORT ohne weitere Umwege zum ersten catch-Block.

    Beispiel:

    try
    {
    wirfBirne();
    }
    catch (Apfel) // passt nicht
    {
    // wird nicht ausgeführt
    }
    catch (Birne) // passt
    {
    // wird ausgeführt
    }
    catch (...) // alles andere - aber es wurde ja was passendes gefunden
    {
    // wird nicht ausgeführt
    }
    

    Okay? 🙂



  • Alles klar,
    vielen Dank (übrigens auch für alle anderen Fragen, die du mir schon beantwortet hast...)

    Gruß Squeegee


Anmelden zum Antworten