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 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 KlasseTestTestFailure
wird 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