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::Failedauslösen, eine innere Klasse zuTest, von der alle Einzeltests erben sollen. Der ausführende Rahmen, derTestRunner, 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 KlasseTestTestFailurewird zwar, wie ich feststellen konnte, noch instanziiert, aber imcatch-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