Exception Handling (cerr - Outputstream)



  • Hallo, ich hab folgenes kleines Problem: Und zwar im Fall, daß eine der beiden Exeptions: BadSize1, OverFlow1 ausgelöst wird, wirde der Outputstream
    cerr nicht angezeigt. D.h. das Programm wird sofort beendet, wenn ich
    nicht auf behandelt vom Debugger stelle. Wenn sich der Debugger darum kümmert erscheint die Standardfehlermeldung und das Programm wird angehalten. Wenn ich es fortsetze wird es sofort beendet - also das gleiche Resultat.

    Jedoch bei der Exception UnderFlow1 ist die Fehlermeldubng zu sehen.
    An den Compilereinstellungen sollte es nicht liegen, da ich alle Möglichkeiten des Exception Handling ausprobiert hab sprich: Behandelt von Debugger oder Anwender, beim Fortsetzen behandelt oder unbehandelt starten (alle 4 Möglichkeiten helfen nicht!).

    Wenn jemand eine Idee hat,... bitte melden.

    //stackselbst.h
    
    #ifndef stackselbsth
    #define stackselbsth
    #include <string>
    
    struct BadSize1
        {
            int sizeerr;
            BadSize1(int s):sizeerr(s){}
        };
    
        struct OverFlow1
        {
            int size;
            OverFlow1(int s):size(s){}
        };
    
        struct UnderFlow1
        {
        };
    
    template<class T> class Stack
    {
    //private:
    
        struct Inhalt
        {
            T wert;
            Inhalt* down;
            Inhalt(T w):wert(w){};
        };
    
        Inhalt* inhalt;
        int size;
        int maxsize;
    
    public:
    
        Stack(int s=0)
        {
            maxsize=s;
            size=0;
            if (maxsize>0) {inhalt=0;}
            else throw BadSize1(maxsize);
        }     
    
       void push(const T& t) // ein Element oben drauflegen
       {
          if (size<maxsize)
          {
                if (inhalt!=0)
                {
                Inhalt* zwinhalt=new Inhalt(t);
                zwinhalt->down=inhalt;
                inhalt=zwinhalt;
                }
                else
                {
                inhalt=new Inhalt(t);
                inhalt->down=0;
                }
                size++;
          }
          else throw OverFlow1(maxsize);
       }
    
       T top() // das oberste Element lesen
       {
       string a="0";
       if (size>0){ return inhalt->wert;}
    
       else return a;
       }
    
       void pop() // das oberste Element entfernen
       {
          if (size==1)
          {
                delete inhalt;
                inhalt=0;
          }
          else if (size>1)
          {
                Inhalt* zwinhalt=inhalt;
                inhalt=inhalt->down;
                delete zwinhalt;
          }
          else throw UnderFlow1();
    
          size--;
       }
    
       bool empty() // ist der Stack leer?
       {
          return !size;
       }
    
       ~Stack()
       {
          while (inhalt!=0)
          {
                Inhalt* zwinhalt=inhalt;
                inhalt=inhalt->down;
                delete zwinhalt;
                size--;
          }
       }
    
    };
    
    #endif
    
    //main.cpp
    
    #pragma hdrstop
    #include <condefs.h>
    #include "stackselbst.h"
    #include <string>
    #include <iostream.h>
    //---------------------------------------------------------------------------
    #pragma argsused
    int main(int argc, char **argv)
    {
    
    try
    {
            Stack<string> a(6);
            string in;
            char wahl='a';
            while (wahl!='0')
            {
                    cout<<endl<<endl
                        <<"1. Push"<<endl
                        <<"2. Top"<<endl
                        <<"3. Pop"<<endl
                        <<"4. Empty"<<endl;
                    cin>>wahl;
                    switch (wahl)
                    {
                    case '0':break;
                    case '1':{cout<<"Wert: ";cin>>in;a.push(in);break;}
                    case '2':{cout<<"Oberster Wert"<<a.top();break;}
                    case '3':{a.pop();break;}
                    case '4':{cout<<"Empty: "<<a.empty()<<endl;break;}
                    }
            }
            cin.get();
    
    }
    catch (BadSize1 x)
    {
            //Problem 1:
            cerr<<"Fehler: BadSize, maximale Größe ist: "<<x.sizeerr<<endl;
            cin.get();
    }
    catch (OverFlow1 y) // ? Geht nicht
    {
            //Problem 2:
            cerr<<"Fehler: Overflow, maximale Größe ist: "<<y.size<<endl;
            cin.get();
    }
    
    catch (UnderFlow1)
    {
            cerr<<"Fehler: Underflow"<<endl;
            cin.get(); //Notwendig sonst seh ich die Meldung nicht
    
    }
    //cin.get(); Das war auch mal ein Versuch
    //return 1;
    }
    


  • exceptions immer per referenz fangen


Anmelden zum Antworten