Exceptions werden nicht gefangen :-(



  • Nabend,

    ich hab in meinem Prog ein seltsames Verhalten. Bin gerade dabei mein Prog zu testen, und da muss ich feststellen, das ich eine Exception nicht fangen kann.
    Die Exception wird erwartungsgemäß geworfen und ich versuche sie mit try / catch zu fangen. Das klappt aber nicht 😞
    Meine Exception Hirarchie sieht so aus:

    class Exception
    {
        public:
            Exception(const int64 lineNumber, const std::string& fileName, const std::string& errorString = "");
            Exception(const Exception& copy);
            virtual ~Exception(void);
            virtual const Exception &operator = (const Exception &other);
    
            int64 lineNumber() const;
            const std::string& fileName() const;
    
            virtual std::string name() const;
            virtual std::string errorString() const;
            virtual std::string additionalString() const;
    };
    
    class IOException : public Exception
    {
       public:
          IOException(const uint lineNumber, const std::string& fileName, const std::string& errorString);
          virtual std::string name() const;
    };
    

    Die Exception wird geworfen, wenn eine Datei nicht geöffnet werden konnte.
    Hier die Methode atEnd()

    bool THttpFile::atEnd()
    {
       if(openMode() & NotOpen)
          throw IOException(__LINE__, __FILE__, "Fehlertext");
       return bytesAvailable() == 0;
    }
    

    Fangen tu ich die Exception so:

    int main()
    {
       try
       {
          std::string line;
    
          // Dieser Host wird ganz bestimmt nicht erreichbar sein...
          THttpFile file("http://www.goooooogle.de/index.html", ReadOnly | Text);
          while(!file.atEnd())
          {
             file.readLine(line);
             std::cout << line;
          }
       }
       catch(const IOException &e)
       {
          std::cout << e.errorString() << std::endl;
       }
    }
    

    Ich hab ja noch die leise Hoffnung, das ich momentan einfach den Wald vor lauter Bäumen nicht sehe.
    Bisher hab ich alle Exception so gefangen und das funktioniert auch...
    Vielleicht seht ihr ja meinen Fehler direkt.
    Das Programm wird unter Debian mit gcc 4.1.2 im Debugmodus (-g) übersetzt.

    Schonmal vielen Dank für's lesen,

    NuckNuck



  • Noch einen Nachtrag:
    An statt die Exception zu fangen, bekomme ich einen Absturz.
    Mit dem Debugger konnte ich mich bis zu dem throw durchkämpfen, dann schmiert das Programm aber leider ab...



  • [quote="nucknuck"]

    // Dieser Host wird ganz bestimmt nicht erreichbar sein...
          THttpFile file("http://www.goooooogle.de/index.html", ReadOnly | Text);
    

    http://www.goooooogle.de/index.html

    /edit: Prüfe nach, ob der Host tatsächlich nicht erreichbar ist. Prüfe außerdem ob eine andere Exception geworfen wird. Falls das Programm tatsächlich abstürzt, bemühe einen Debugger.



  • Ok, ich hab mich ungünstig ausgedrückt. Du hast recht, der Host ist erreichbar, allerdings ist die Datei index.html nicht verfügbar (404).
    Das wird schon korrekt erkannt.
    Was den Debugger betrifft, den verwende ich ja. Ich komme bis zu dem erwarteten throw.
    Dann schmiert das Programm ab. Ich kann die Exception nicht mal im Debugger verfolgen.
    Wie krieg ich jetzt raus was da schieft läuft? Hängt das überhaupt mit den Exceptions zusammen?

    NuckNuck



  • nucknuck schrieb:

    Was den Debugger betrifft, den verwende ich ja. Ich komme bis zu dem erwarteten throw.

    Sorry, ich hab dein zweites Posting nicht wahrgenommen.

    Was heißt denn "bis zu" dem throw? Wird die Zeile erreicht, aber die Exception nicht konstruiert? Wäre es evtl. denkbar, dass der Fehler im Konstruktor der Exception auftritt?

    Könnte vielleicht vorher schon ein Fehler aufgetreten sein (z. B. Buffer Overflow), der sich erst später bemerkbar macht? Entferne alles unnötige aus dem Programm, um den Fehler einzukreisen.



  • nucknuck schrieb:

    ...
       catch(const IOException &e)
    ...
    

    Ich muss sagen, dass ich das Konstrukt mit const nicht kenne. Weiß nicht, ob es daran liegt, würde es aber mal ausprobieren. Bei exceptions wird "hinter den Kulissen" noch kopiert und ich weiß nicht, ob das mit dem const wie erwartet funktioniert.
    Außerdem kann es sein, dass eine "Typinkonsistenz" auftritt: Mit catch() installierst Du einen exceptionhandler für ein "const IOException" die vielleicht typmäßig nicht der "IOException" entspricht, die Du wirfst ....

    Ist aber erstmal nur eine Vermutung.

    EDIT: ... die aber wohl falsch ist. Mein gcc stößt sich jedenfalls nicht am const:
    Fazit: Weiß auch nicht, woran es bei Dir liegt.

    Gruß,

    Simon2.



  • Hi,

    was machst Du eigentlich im Copy-Ctor Deiner exception ?
    Das Problem ist, dass exceptions halt kopiert werden (in eine "safe location") und wenn das Deiner Klasse nicht bekommt, wäre das schlecht.... (mal abgesehen davon, dass Du zwar einen CopyCtor für die Basis aber nicht für das Kind hast).

    Gruß,

    Simon2.


  • Mod

    Die Verwendung von std::string (und jedes anderen Typs, der beim Initialisieren werfen kann) ist in einer Exception Klasse außerordentlich ungünstig. Denn damit riskiert man immer den Wurf einer zweiten Exception, was grünsätzlich mit terminate() bestraft wird. Es ist auch nicht sinnvoll, den Zuweisungsoperator virtuell zu deklarieren.


Anmelden zum Antworten