<?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[Exceptions, verstehe den Ablauf noch nicht so ganz]]></title><description><![CDATA[<p>Stellt euch mal ungefähr so einen Funktionsablauf vor:<br />
(nur ganz grob mal)</p>
<pre><code class="language-cpp">void f(int a)
{
    ........
    ......
    if(a == 19)
    {
        throw runtime_error(&quot;Benzin läuft aus!&quot;);
    }
    else
    {
        cout &lt;&lt; &quot;CHECK: Okay!&quot; &lt;&lt; endl;
    }
    ......
    .......
}

void g(int b)
{
    ......
    ......
    f(19);
    .......
    ......
}

void j(int c)
{
    ......
    .......
    g(23);
    .......
    ........
}

int main()
{
    try
    {
        j(320);
    }
    catch(runtime_error err)
    {
        cout &lt;&lt; err.what() &lt;&lt; endl;
        .....
        .......
    }

    return 0;
}
</code></pre>
<p>Wenn nun in Funktion f wirklich eine Ausnahme geworfen wird, was passiert dann genau? Wird die Funktion g sofort abgebrochen? Oder läuft es die Funktion trotzdem noch durch? Wird g und j auch abgebrochen? Und es geht sofort zum Handler um den Fehler abzufangen, und dann gehts wieder zurück zu f? Kann ich mir ein &quot;throw&quot; wie ein &quot;break&quot; vorstellen des erstmal abbricht?..........</p>
<p>Könnt ihr mir den ganzen Ablauf in meinem Beispiel, mal versuchen zu erklären? Oder wenns einfacher für euch ist, könnt ihrs mir auch an nem eigenen Code-Beispiel von euch selbst erklären?!</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/239132/exceptions-verstehe-den-ablauf-noch-nicht-so-ganz</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 14:16:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/239132.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Apr 2009 19:44:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Exceptions, verstehe den Ablauf noch nicht so ganz on Sun, 19 Apr 2009 19:44:12 GMT]]></title><description><![CDATA[<p>Stellt euch mal ungefähr so einen Funktionsablauf vor:<br />
(nur ganz grob mal)</p>
<pre><code class="language-cpp">void f(int a)
{
    ........
    ......
    if(a == 19)
    {
        throw runtime_error(&quot;Benzin läuft aus!&quot;);
    }
    else
    {
        cout &lt;&lt; &quot;CHECK: Okay!&quot; &lt;&lt; endl;
    }
    ......
    .......
}

void g(int b)
{
    ......
    ......
    f(19);
    .......
    ......
}

void j(int c)
{
    ......
    .......
    g(23);
    .......
    ........
}

int main()
{
    try
    {
        j(320);
    }
    catch(runtime_error err)
    {
        cout &lt;&lt; err.what() &lt;&lt; endl;
        .....
        .......
    }

    return 0;
}
</code></pre>
<p>Wenn nun in Funktion f wirklich eine Ausnahme geworfen wird, was passiert dann genau? Wird die Funktion g sofort abgebrochen? Oder läuft es die Funktion trotzdem noch durch? Wird g und j auch abgebrochen? Und es geht sofort zum Handler um den Fehler abzufangen, und dann gehts wieder zurück zu f? Kann ich mir ein &quot;throw&quot; wie ein &quot;break&quot; vorstellen des erstmal abbricht?..........</p>
<p>Könnt ihr mir den ganzen Ablauf in meinem Beispiel, mal versuchen zu erklären? Oder wenns einfacher für euch ist, könnt ihrs mir auch an nem eigenen Code-Beispiel von euch selbst erklären?!</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698323</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sun, 19 Apr 2009 19:44:12 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptions, verstehe den Ablauf noch nicht so ganz on Sun, 19 Apr 2009 20:04:59 GMT]]></title><description><![CDATA[<p>Wenn du eine Exception wirfst, fliegt sie solange, bis sie gefangen wird. Wird sie nicht gefangen, bringt sie das Programm zum Absturz.</p>
<p>In deinem Beispiel wird die Funktion <code>f()</code> beim <code>throw</code> -Statement unmittelbar verlassen. Der Rest der Funktion wird nicht mehr ausgeführt, nach der Fehlerbehandlung kehrt das Programm auch nicht dahin zurück. In den Funktionen <code>g()</code> und <code>j()</code> passiert nichts, da fliegt die Exception ungehindert durch. Erst in <code>main()</code> fängst du sie ab, wodurch du in den <code>catch</code> -Block gelangst.</p>
<p>Ich würde die Exception übrigens eher als Referenz auffangen:</p>
<pre><code class="language-cpp">catch (std::runtime_error&amp; err)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1698331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698331</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Apr 2009 20:04:59 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptions, verstehe den Ablauf noch nicht so ganz on Sun, 19 Apr 2009 20:16:56 GMT]]></title><description><![CDATA[<p>Ah, okay, also nur die funktion in der die Ausnahme geworfen wird, wird sofort beendet. Anschließende &quot;Überfunktionen&quot; werden jedoch ganz normal weiter durchlaufen, bis irgendwann die Ausnahme abgefangen wird. Aber wie soll ich mir so eine geworfene Ausnahme vorstellen, kann ich mir dass wie ein &quot;2tes unsichtbares return&quot; vorstellen, welches die Ausnahme von jeder &quot;Unterfunktion&quot; immer weiter in die nächst höhere &quot;Überfunktion&quot; returned, bis sie im try Block landet, und dann letztlich im Handler abgefangen wird? (oder dass Programm wird halt einfach abgebrochen, wenn es kein passender catch Block innerhalb des Handlers vorhanden ist.)</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698335</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Sun, 19 Apr 2009 20:16:56 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptions, verstehe den Ablauf noch nicht so ganz on Sun, 19 Apr 2009 20:24:38 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>Anschließende &quot;Überfunktionen&quot; werden jedoch ganz normal weiter durchlaufen, bis irgendwann die Ausnahme abgefangen wird.</p>
</blockquote>
<p>Nein, auch diese werden nicht mehr weiter ausgeführt, sondern die Exception fliegt &quot;hindurch&quot;, also ohne in der Funktion noch irgendetwas anzurichten.</p>
<p>Stromberg schrieb:</p>
<blockquote>
<p>Aber wie soll ich mir so eine geworfene Ausnahme vorstellen, kann ich mir dass wie ein &quot;2tes unsichtbares return&quot; vorstellen, welches die Ausnahme von jeder &quot;Unterfunktion&quot; immer weiter in die nächst höhere &quot;Überfunktion&quot; returned, bis sie im try Block landet, und dann letztlich im Handler abgefangen wird?</p>
</blockquote>
<p>Ja, könntest du dir so vorstellen. Du musst einfach wissen, dass nach der <code>throw</code> -Anweisung kein Code mehr ausgeführt wird, bis du dich wieder im <code>catch</code> -Block befindest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698338</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 19 Apr 2009 20:24:38 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptions, verstehe den Ablauf noch nicht so ganz on Mon, 20 Apr 2009 06:17:11 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>[...]In den Funktionen <code>g()</code> und <code>j()</code> passiert nichts, da fliegt die Exception ungehindert durch[...]</p>
</blockquote>
<p>Das kann man so nicht stehen lassen. Die ganzen Variablen mit <em>automatischer Speicherdauer</em>, die Du in <code>g()</code> und <code>j()</code> bis zum Exception auslösenden Aufruf angelegt hast, werden wieder freigegeben. Bei komplexen Objekten bedeutet das, dass deren Destruktoren aufgerufen werden. Es wird also durchaus noch Code aufgerufen.<br />
Das ist eine sehr wichtige Eigenschaft bei dem Mechanismus, der einem viel Arbeit bei der Ressourcenverwaltung sparen kann, wenn man ihn richtig ausnutzt. Als Stichwort für die Suchmaschine werfe ich mal <em>RAII</em> in den Raum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698412</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 20 Apr 2009 06:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptions, verstehe den Ablauf noch nicht so ganz on Mon, 20 Apr 2009 07:43:47 GMT]]></title><description><![CDATA[<p>Als Einstiegslektüre die einem ein wenig den Umgang und die Gefahren beim Exceptionhandling näherbringen kann empfehle ich die entsprechenden Absätze im <a href="http://www.gotw.ca/gotw" rel="nofollow">Guru of the Week</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698449</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 20 Apr 2009 07:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptions, verstehe den Ablauf noch nicht so ganz on Mon, 20 Apr 2009 12:45:30 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Das kann man so nicht stehen lassen.</p>
</blockquote>
<p>Du hast natürlich Recht, das war etwas ungenau. Vielen Dank für die Ergänzung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698600</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 20 Apr 2009 12:45:30 GMT</pubDate></item><item><title><![CDATA[Reply to Exceptions, verstehe den Ablauf noch nicht so ganz on Mon, 20 Apr 2009 19:50:04 GMT]]></title><description><![CDATA[<p>Es passiert genau dasselbe, was auch passieren würde, wenn die Funktionen, an genau der Stelle wo die Exception &quot;durchfliegt&quot; mit &quot;return&quot; verlassen würden. Natürlich mit dem Unterschied, dass es keinen Returnwert, dafür aber eine Exception gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1698862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1698862</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 20 Apr 2009 19:50:04 GMT</pubDate></item></channel></rss>