<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Runtime Error bei Ausnahme-Auslösung mit throw - warum?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nachfolgender Code stellt ein Miniatur-Testframework dar, mit dem eine Reihe automatischer Tests ausgeführt werden soll. Ein fehlschlagender Test soll die Ausnahme <code>Test::Failed</code> auslösen, eine innere Klasse zu <code>Test</code> , von der alle Einzeltests erben sollen. Der ausführende Rahmen, der <code>TestRunner</code> , nimmt diese Ausnahme entgegen und vermerkt den Test mit einem <code>&quot;-&quot;</code> als fehlgeschlagen. Für alle fehlgeschlagenen Tests sollen danach der Ausnahmetext und der Name der testenden Klasse ausgegeben werden.</p>
<p>Leider geht irgend etwas schief beim Durchreichen der Ausnahme an den <code>TestRunner</code> . Das Ausnahmeobjekt der Klasse <code>TestTestFailure</code> wird zwar, wie ich feststellen konnte, noch instanziiert, aber im <code>catch</code> -Block für diese Ausnahme kommt er nicht mehr an: Das <code>&quot;-&quot;</code> wird nicht mehr ausgegeben. Stattdessen bricht der Prozess mit einem Runtime-Error ab.</p>
<p>Ich habe keine Idee, woran das liegen könnte. Vielleicht sieht es jemand aus diesem Forum?</p>
<p>Merci und Gruss,<br />
Rüdiger</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;typeinfo&gt;
#include &lt;list&gt;
#include &lt;string&gt;

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&lt;Test*&gt; 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(&quot;Planned Failure&quot;,this);
      }                      
  };        

// --- TestRunner Implementation
void TestRunner::run() {
  list&lt;Test*&gt;::iterator i;
  list&lt;Test::Failed&gt; failed;
  list&lt;Test::Failed&gt;::iterator j;
  for (i=tests.begin();i!=tests.end();i++) {
    try {
      (*i)-&gt;run();
      cout &lt;&lt; &quot;.&quot;;
      } catch (Test::Failed&amp; f) {
        cout &lt;&lt; &quot;-&quot;;      
        failed.push_back(f);     
        };        
   (*i)-&gt;teardown();
    }
  cout &lt;&lt; endl;
  for (j=failed.begin(); j!=failed.end(); j++) {
    cout &lt;&lt; j-&gt;className &lt;&lt; &quot; - &quot; &lt;&lt; j-&gt;msg &lt;&lt; endl;  
    }           
  }       

void TestRunner::add(Test* t) {  
  tests.push_back(t);
  }

Test::Failed::Failed(const char* msg, const Test* test) {
  this-&gt;msg  = msg;
  this-&gt;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;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/254708/runtime-error-bei-ausnahme-auslösung-mit-throw-warum</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 08:14:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/254708.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 Nov 2009 21:31:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Runtime Error bei Ausnahme-Auslösung mit throw - warum? on Fri, 20 Nov 2009 07:15:35 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nachfolgender Code stellt ein Miniatur-Testframework dar, mit dem eine Reihe automatischer Tests ausgeführt werden soll. Ein fehlschlagender Test soll die Ausnahme <code>Test::Failed</code> auslösen, eine innere Klasse zu <code>Test</code> , von der alle Einzeltests erben sollen. Der ausführende Rahmen, der <code>TestRunner</code> , nimmt diese Ausnahme entgegen und vermerkt den Test mit einem <code>&quot;-&quot;</code> als fehlgeschlagen. Für alle fehlgeschlagenen Tests sollen danach der Ausnahmetext und der Name der testenden Klasse ausgegeben werden.</p>
<p>Leider geht irgend etwas schief beim Durchreichen der Ausnahme an den <code>TestRunner</code> . Das Ausnahmeobjekt der Klasse <code>TestTestFailure</code> wird zwar, wie ich feststellen konnte, noch instanziiert, aber im <code>catch</code> -Block für diese Ausnahme kommt er nicht mehr an: Das <code>&quot;-&quot;</code> wird nicht mehr ausgegeben. Stattdessen bricht der Prozess mit einem Runtime-Error ab.</p>
<p>Ich habe keine Idee, woran das liegen könnte. Vielleicht sieht es jemand aus diesem Forum?</p>
<p>Merci und Gruss,<br />
Rüdiger</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;typeinfo&gt;
#include &lt;list&gt;
#include &lt;string&gt;

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&lt;Test*&gt; 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(&quot;Planned Failure&quot;,this);
      }                      
  };        

// --- TestRunner Implementation
void TestRunner::run() {
  list&lt;Test*&gt;::iterator i;
  list&lt;Test::Failed&gt; failed;
  list&lt;Test::Failed&gt;::iterator j;
  for (i=tests.begin();i!=tests.end();i++) {
    try {
      (*i)-&gt;run();
      cout &lt;&lt; &quot;.&quot;;
      } catch (Test::Failed&amp; f) {
        cout &lt;&lt; &quot;-&quot;;      
        failed.push_back(f);     
        };        
   (*i)-&gt;teardown();
    }
  cout &lt;&lt; endl;
  for (j=failed.begin(); j!=failed.end(); j++) {
    cout &lt;&lt; j-&gt;className &lt;&lt; &quot; - &quot; &lt;&lt; j-&gt;msg &lt;&lt; endl;  
    }           
  }       

void TestRunner::add(Test* t) {  
  tests.push_back(t);
  }

Test::Failed::Failed(const char* msg, const Test* test) {
  this-&gt;msg  = msg;
  this-&gt;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;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1810703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810703</guid><dc:creator><![CDATA[Rüdiger Plantiko]]></dc:creator><pubDate>Fri, 20 Nov 2009 07:15:35 GMT</pubDate></item><item><title><![CDATA[Reply to Runtime Error bei Ausnahme-Auslösung mit throw - warum? on Thu, 19 Nov 2009 21:54:01 GMT]]></title><description><![CDATA[<p>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</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810713</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 19 Nov 2009 21:54:01 GMT</pubDate></item><item><title><![CDATA[Reply to Runtime Error bei Ausnahme-Auslösung mit throw - warum? on Fri, 20 Nov 2009 06:11:29 GMT]]></title><description><![CDATA[<p>Bei mir (gcc-4.4.2) geht dein Beispiel ohne Probleme.<br />
Kann an dem Code auch keinen Fehler erkennen.<br />
Kannst du aber vllt. mal ne const-Referenz auf den Error abfangen? Eine änderbare Referenz brauchst du ja wirklich nicht (hoffe ich...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810784</guid><dc:creator><![CDATA[sansara]]></dc:creator><pubDate>Fri, 20 Nov 2009 06:11:29 GMT</pubDate></item><item><title><![CDATA[Reply to Runtime Error bei Ausnahme-Auslösung mit throw - warum? on Fri, 20 Nov 2009 07:23:55 GMT]]></title><description><![CDATA[<p>Hallo unskilled!</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>wieso werden denn für C++ Code von Anfängern ...</p>
</blockquote>
<p>genauer: von <code>www.c-plusplus.net</code> -Anfängern</p>
<blockquote>
<p>... immer wieder die Code-Tags benutzt(wenn überhaupt)? Editier mal C++-Tags rein</p>
</blockquote>
<p>Und dabei prangt der Button einem schon als allererster in der Toolbar entgegen. Ich weiss nicht, warum ich trotzdem &lt;code&gt; gedrückt habe sorry!</p>
<p>Habe das angepasst, jetzt sieht's schon besser aus, gell?</p>
<p>Gruss,<br />
Rüdiger</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810799</guid><dc:creator><![CDATA[Rüdiger Plantiko]]></dc:creator><pubDate>Fri, 20 Nov 2009 07:23:55 GMT</pubDate></item><item><title><![CDATA[Reply to Runtime Error bei Ausnahme-Auslösung mit throw - warum? on Fri, 20 Nov 2009 07:29:14 GMT]]></title><description><![CDATA[<p>sansara schrieb:</p>
<blockquote>
<p>Bei mir (gcc-4.4.2) geht dein Beispiel ohne Probleme.</p>
</blockquote>
<p>Danke fürs Nachprüfen.</p>
<p>Hm, dann liegt es wohl am Compiler... Ich benutze gcc-3.4.2 (mingw) und bekomme folgende Fehlermeldung</p>
<p>`This application has requested the Runtime to terminate it in an unusual way.</p>
<p>Please contact the application's support team for more information.`</p>
<p>Werde es mal mit einem höheren Release probieren.</p>
<blockquote>
<p>Kannst du aber vllt. mal ne const-Referenz auf den Error abfangen? Eine änderbare Referenz brauchst du ja wirklich nicht (hoffe ich...).</p>
</blockquote>
<p>Oh ja, natürlich. Danke für den Hinweis.</p>
<p>Gruss,<br />
Rüdiger</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810801</guid><dc:creator><![CDATA[Rüdiger Plantiko]]></dc:creator><pubDate>Fri, 20 Nov 2009 07:29:14 GMT</pubDate></item><item><title><![CDATA[Reply to Runtime Error bei Ausnahme-Auslösung mit throw - warum? on Fri, 20 Nov 2009 07:47:51 GMT]]></title><description><![CDATA[<p>Hallo sansara,</p>
<p>habe es eben mit gcc 4.4.0 (mingw) kompiliert - und konnte es problemlos ausführen. Die Ausgabe ist nun wie gewünscht:</p>
<p>`-</p>
<p>15TestTestFailure - Planned Failure`</p>
<p>Danke fürs Schauen.</p>
<p>Gruss,<br />
Rüdiger</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1810806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1810806</guid><dc:creator><![CDATA[Rüdiger Plantiko]]></dc:creator><pubDate>Fri, 20 Nov 2009 07:47:51 GMT</pubDate></item></channel></rss>