Runtime Error bei Ausnahme-Auslösung mit throw - warum?



  • Hallo zusammen,

    nachfolgender Code stellt ein Miniatur-Testframework dar, mit dem eine Reihe automatischer Tests ausgeführt werden soll. Ein fehlschlagender Test soll die Ausnahme Test::Failed auslösen, eine innere Klasse zu Test , von der alle Einzeltests erben sollen. Der ausführende Rahmen, der TestRunner , nimmt diese Ausnahme entgegen und vermerkt den Test mit einem "-" als fehlgeschlagen. Für alle fehlgeschlagenen Tests sollen danach der Ausnahmetext und der Name der testenden Klasse ausgegeben werden.

    Leider geht irgend etwas schief beim Durchreichen der Ausnahme an den TestRunner . Das Ausnahmeobjekt der Klasse TestTestFailure wird zwar, wie ich feststellen konnte, noch instanziiert, aber im catch -Block für diese Ausnahme kommt er nicht mehr an: Das "-" wird nicht mehr ausgegeben. Stattdessen bricht der Prozess mit einem Runtime-Error ab.

    Ich habe keine Idee, woran das liegen könnte. Vielleicht sieht es jemand aus diesem Forum?

    Merci und Gruss,
    Rüdiger

    #include <iostream>
    #include <typeinfo>
    #include <list>
    #include <string>
    
    using namespace std;
    
    // --- A simple type for tests
    class Test {
      public:    
        class Failed {
          public: 
            Failed(const char* msg, const Test* test); 
            string msg;
            string className;          
          };             
        virtual void run() throw (Test::Failed) = 0; 
        virtual void teardown() {};
      };      
    
    // --- TestRunner Definition
    class TestRunner {
      public: 
        void run();          
        void add(Test* t);
      private:
        list<Test*> tests;  
      };     
    
    // --- Example class 
    // showing the reaction of the test framework on a failing test  
    class TestTestFailure : public Test {
      public:
        virtual void run() throw(Test::Failed) {
          throw Test::Failed("Planned Failure",this);
          }                      
      };        
    
    // --- TestRunner Implementation
    void TestRunner::run() {
      list<Test*>::iterator i;
      list<Test::Failed> failed;
      list<Test::Failed>::iterator j;
      for (i=tests.begin();i!=tests.end();i++) {
        try {
          (*i)->run();
          cout << ".";
          } catch (Test::Failed& f) {
            cout << "-";      
            failed.push_back(f);     
            };        
       (*i)->teardown();
        }
      cout << endl;
      for (j=failed.begin(); j!=failed.end(); j++) {
        cout << j->className << " - " << j->msg << endl;  
        }           
      }       
    
    void TestRunner::add(Test* t) {  
      tests.push_back(t);
      }
    
    Test::Failed::Failed(const char* msg, const Test* test) {
      this->msg  = msg;
      this->className = typeid(*test).name();
      };                                                      
    
    int main(int argc, char *argv[])
    {
        TestRunner testRunner;
    
    // Tests will be added here
        testRunner.add( new TestTestFailure );
    
    // Execute the test suite
        testRunner.run(); 
    
        return EXIT_SUCCESS;
    }
    


  • wieso werden denn für C++ Code von Anfängern immer wieder die Code-Tags benutzt(wenn überhaupt)? Editier mal C++-Tags rein, dann guckt sich das mit Sicherheit auch wer an - aber so müsste mans ja erst in ne IDE kopieren und da bin ich zu faul - lieber nen ewig langen Text schreiben xD



  • Bei mir (gcc-4.4.2) geht dein Beispiel ohne Probleme.
    Kann an dem Code auch keinen Fehler erkennen.
    Kannst du aber vllt. mal ne const-Referenz auf den Error abfangen? Eine änderbare Referenz brauchst du ja wirklich nicht (hoffe ich...).



  • Hallo unskilled!

    unskilled schrieb:

    wieso werden denn für C++ Code von Anfängern ...

    genauer: von www.c-plusplus.net -Anfängern

    ... immer wieder die Code-Tags benutzt(wenn überhaupt)? Editier mal C++-Tags rein

    Und dabei prangt der Button einem schon als allererster in der Toolbar entgegen. Ich weiss nicht, warum ich trotzdem <code> gedrückt habe sorry!

    Habe das angepasst, jetzt sieht's schon besser aus, gell?

    Gruss,
    Rüdiger



  • sansara schrieb:

    Bei mir (gcc-4.4.2) geht dein Beispiel ohne Probleme.

    Danke fürs Nachprüfen.

    Hm, dann liegt es wohl am Compiler... Ich benutze gcc-3.4.2 (mingw) und bekomme folgende Fehlermeldung

    `This application has requested the Runtime to terminate it in an unusual way.

    Please contact the application's support team for more information.`

    Werde es mal mit einem höheren Release probieren.

    Kannst du aber vllt. mal ne const-Referenz auf den Error abfangen? Eine änderbare Referenz brauchst du ja wirklich nicht (hoffe ich...).

    Oh ja, natürlich. Danke für den Hinweis.

    Gruss,
    Rüdiger



  • Hallo sansara,

    habe es eben mit gcc 4.4.0 (mingw) kompiliert - und konnte es problemlos ausführen. Die Ausgabe ist nun wie gewünscht:

    `-

    15TestTestFailure - Planned Failure`

    Danke fürs Schauen.

    Gruss,
    Rüdiger


Log in to reply