Problem bei Vereinfachung einer Ausnahme



  • Hallo zusammen,

    ich mache grade ein C++ Tutorial und bin ein wenig stuck. Ich soll in dem Abschnitt verschiedene Ausnahmen ausprobieren. Das hier ist das, was ich bis jetzt gecodet habe:

     ... #include <iostream>
    #include <string>
    #include <stdexcpt.h>
    using namespace std;
    
    //Klasse der Ausnahme
    class null_division
    {
    public:
    	null_division()
    		: What("Division misslungen")
    	{
    	}
    
    	string what()
    	{
    		return What;
    	}
    
    private:
    	string What;
    };
    
    double division(double a, double b) {
    	return (a / b);
    }
    
    int main() {
    	try
    	{
    		double N1, N2;
    		cout << "Ganzzahl 1: ";
    		cin >> N1;
    		cout << "Ganzzahl 2: ";
    		cin >> N2;
    		if (N2 == 0)
    			throw null_division();
    		cout << N1 << " / " << N2 << " = " << division(N1, N2) << endl;
    		system("pause");
    	}
    	catch (null_division &ex)
    	{
    		cerr << ex.what() << endl;
    		system("pause");
    	}
    }... 
    

    Und das hier wäre die nächste Aufgabe:
    Vereinfachen Sie den Code aus Aufgabe 1, indem Sie die Klasse null_division von std::runtime_error ableiten. Diese Klasse ist in der Header-Datei stdexcept definiert und von std::exception abgeleitet. Ändern Sie ausschließlich die Klasse null_division in Ihrem Programm, und zwar so, dass Ihr Code danach immer noch problemlos kompiliert und das Programm bei einer Division durch 0 die entsprechende Meldung anzeigt.

    Tipp dafür ist:
    Diese Aufgabe hat genaugenommen gar nichts mit Exception Handling zu tun, sondern dreht sich um Vererbung. Schlagen Sie in einer Dokumentation des C++ Standards nach, wie die Klasse std::runtime_error definiert ist. Sie werden sehen, dass Ihre Klasse null_division stark vereinfacht werden kann.

    Problem dabei ist, das ich keine Ahnung habe wie ich was damit vereinfachen soll. Also hätte ich gerne erklärt, wie und warum ich damit meine Klasse vereinfachen kann.
    Danke im Voraus!



  • Alle Tipps wären hilfreich, haltet euch nicht zurück



  • Na steht ja eigentlich so gut wie alles da.
    Leite doch einfach von std::runtime_error ab, so wie es da steht.

    Denke ableiten sollte klappen. Oder? Und wenn du die Klasse std::runtime_error anschaust bzw. wiederum deren Basisklasse std::exception wirst du entdecken dass diese bereits ein .... hat.



  • @hilfmir sagte in Problem bei Vereinfachung einer Ausnahme:

    #include <stdexcpt.h>

    Der Header heißt <stdexcept>

    @hilfmir sagte in Problem bei Vereinfachung einer Ausnahme:

      if (N2 == 0)
      	throw null_division();
    

    sollte wohl eher Aufgabe von division() sein.



  • @swordfish sagte in Problem bei Vereinfachung einer Ausnahme:

    @hilfmir sagte in Problem bei Vereinfachung einer Ausnahme:

    #include <stdexcpt.h>

    Der Header heißt <stdexcept>

    Oh, ja, hab stdexcept wohl zuerst falsch geschrieben und deswegen hat er nicht funktioniert, deswegen hab ich stdexcpt.h benutzt. Mein Fehler.

    @hilfmir sagte in Problem bei Vereinfachung einer Ausnahme:

      if (N2 == 0)
      	throw null_division();
    

    sollte wohl eher Aufgabe von division() sein.

    Wieso? Das ist doch für die Ausnahme, wenn der Anwender versucht, durch 0 zu teilen. Die Division kommt eine line später. Oder ist das irgendwie falsch?



  • @booster Ehh, danke für die Antwort, aber die sagt mir genau so viel wie die Aufgabe selbst. Ich weiß immer noch nicht was ich machen muss.



  • Der Sinn von Exceptions ist es doch, eine Funktion abzusichern, so daß die Exception von übergeordneten Funktionen gefangen werden kann.

    Bei deinem Code brauchst du doch so keine Exception werfen, sondern könntest gleich folgendes schreiben:

    if (N2 == 0)
      cout << ""Division misslungen" << endl;
    else
      // ...
    

    PS: double und "Ganzzahl" widersprechen sich ;- )



  • @th69 Ja, ich weiß. Das sollte man nur so machen weil es in der Aufgabe steht. Deswegen benutze ich auch double und nicht z.B. int. Das ist alles nur für "Übung."



  • double division(double a, double b)
    {
    	if( b == 0. )
    		throw null_division;
    	return a / b;
    }
    


  • @swordfish Also wenn wo Null wirklich die Bedeutung "die Zahl Null" hat, dann schreib ich normalerweise if (n == 0) und nicht if (!n)...



  • @hustbaer sagte in Problem bei Vereinfachung einer Ausnahme:

    dann schreib ich

    tjoa



  • Das ist zwar alles hilfreich, ich verstehe aber immer noch nicht, wie ich meine Klasse null_division vereinfachen soll.



  • Was passiert denn, wenn Du Deine Klasse null_division von std::runtime_error erben lässt?



  • es lässt sich nicht mehr kompilieren und ich kriege den error das die klasse runtime_error keinen default konstruktor hat

    bin ich dumm oder so?



  • Dann guck dir doch mal an, was für Parameter der Konstruktor so nimmt:
    https://en.cppreference.com/w/cpp/error/runtime_error

    Könnte der ggf. für dich nützlich sein?



  • @wob ja, denke schon, ich wüsste aber nicht wie ich den anwenden soll damit am ende die gleiche nachricht wie davor rauskommt



  • @hilfmir sagte in Problem bei Vereinfachung einer Ausnahme:

    ich kriege den error das die klasse runtime_error keinen default konstruktor hat

    Aha. Und wo in Deinem Code glaubst Du könnte der vonnöten sein?



  • @hilfmir sagte in Problem bei Vereinfachung einer Ausnahme:

    ich wüsste aber nicht wie ich den anwenden soll

    Vielleicht bringt dich die Beantwortung folgender Frage weiter:
    Wie/wo ruft man denn den Konstruktor derjenigen Klasse auf, von der man erbt? Insbesondere wo in der abgeleiteten Klasse macht man das?



  • Noch ein Tipp: bei der Klasse null_division hast du die Syntax auch schon benutzt.



  • okay habs.
    hier ist der code falls ihn wer braucht/will:

     ... #include <iostream>
    #include <string>
    #include <stdexcept>
    using namespace std;
    
    //Klasse der Ausnahme
    class null_division : public runtime_error
    
    {
    public:
    	null_division()
    		: runtime_error("Division misslungen, bitte eine Zahl ungleich 0 eingeben.")
    	{
    	}
    };
    
    double division(double a, double b) {
    	if (b == 0)
    		throw null_division();
    	return (a / b);
    }
    
    int main() {
    		double N1, N2;
    		N2 = 0;
    		while (N2 == 0) {
    			try
    			{
    				cout << "Ganzzahl 1: ";
    				cin >> N1;
    				cout << "Ganzzahl 2: ";
    				cin >> N2;
    				cout << N1 << " / " << N2 << " = " << division(N1, N2) << endl;
    				system("pause");
    			}
    			catch (null_division &ex)
    			{
    				cerr << ex.what() << endl;
    				system("pause");
    			}
    		}
    } ... 
    

Log in to reply