<?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[Fragen zu try..catch]]></title><description><![CDATA[<p>Hallole.</p>
<p>Ich programmiere ISAPI DLLs mit C.<br />
Ich habe immer wieder C++ Elemente mit eingebaut und auch schon einige klassen verwendet.<br />
Da ich noch in Sachen C++ Anfänger bin, aber weiterkommen möchte, versuche imer immer wieder was neues. Heute ist try-catch dran.</p>
<p>Eigentlich sollte das ganz einfach sein, habe aber trotzdem das Problem, daß meine mit Absicht produzierte Ausnahme nicht abgefangen wird.<br />
Dabei versuche ich es mit einer einfachen Division durch 0.</p>
<pre><code>try
{
    int divisor=0;
    int dividend=1;
    int quotient = dividend/divisor; // hier knallt es!
}
catch (...)
{
WriteClient(pECB2,&quot;hier knallt es&quot;);

}
</code></pre>
<p>Das WriteClient ist einfach die ISAPI Funktion die den Text an den Webbrowser sendet, ist hier aber unrelevant.<br />
Wenn ich das mit dem VC++ debugge bricht er ab, mit der Meldung, daß eine division durch 0 vorliegt, lasse ich das Programm laufen, schmiert es ab.<br />
Dabei sollte er doch in den &quot;catch&quot; Zweig gehen und die Meldung ausgeben oder was habe ich falsch verstanden???</p>
<p>Danke Mondmann</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/162490/fragen-zu-try-catch</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 09:20:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/162490.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 Oct 2006 08:09:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 08:09:14 GMT]]></title><description><![CDATA[<p>Hallole.</p>
<p>Ich programmiere ISAPI DLLs mit C.<br />
Ich habe immer wieder C++ Elemente mit eingebaut und auch schon einige klassen verwendet.<br />
Da ich noch in Sachen C++ Anfänger bin, aber weiterkommen möchte, versuche imer immer wieder was neues. Heute ist try-catch dran.</p>
<p>Eigentlich sollte das ganz einfach sein, habe aber trotzdem das Problem, daß meine mit Absicht produzierte Ausnahme nicht abgefangen wird.<br />
Dabei versuche ich es mit einer einfachen Division durch 0.</p>
<pre><code>try
{
    int divisor=0;
    int dividend=1;
    int quotient = dividend/divisor; // hier knallt es!
}
catch (...)
{
WriteClient(pECB2,&quot;hier knallt es&quot;);

}
</code></pre>
<p>Das WriteClient ist einfach die ISAPI Funktion die den Text an den Webbrowser sendet, ist hier aber unrelevant.<br />
Wenn ich das mit dem VC++ debugge bricht er ab, mit der Meldung, daß eine division durch 0 vorliegt, lasse ich das Programm laufen, schmiert es ab.<br />
Dabei sollte er doch in den &quot;catch&quot; Zweig gehen und die Meldung ausgeben oder was habe ich falsch verstanden???</p>
<p>Danke Mondmann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157438</guid><dc:creator><![CDATA[Mondmann]]></dc:creator><pubDate>Thu, 19 Oct 2006 08:09:14 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 08:15:35 GMT]]></title><description><![CDATA[<p>Du musst erst noch eine Exception werfen, damit dein Code funktioniert. Weißt du, der / operator wirft halt keine exceptions <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
D.h. du musst</p>
<pre><code class="language-cpp">if (divisor == 0)
  throw divisor;
</code></pre>
<p>einbauen, bevor zu teilst.</p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157442</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 19 Oct 2006 08:15:35 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 08:23:15 GMT]]></title><description><![CDATA[<p>Hmm... das ist ja blöde....<br />
Dann kann ich also ohne den Code von Dir nicht verhindern, daß das Programm abstürzt?<br />
Dann ist doch der ganze Sinn von try...catch dahin oder?<br />
Dann brauche ich das gar nimmer.<br />
Dann mache ich ne if(divisor==0){&quot;Fehlermeldung&quot;}; - Schleife und alles ist gut.<br />
Für was brauche ich dann noch try-catch?</p>
<p>Ich dachte damit kann ich komfortabel verhindern, daß mein Programm abstützt, denn ich habe das schon mit anderen Versuchen getestet zb:</p>
<pre><code>_snprintf_s(buffer,1024,1024,&quot;%s%s%s%s%s&quot;,header,top,menue,main, footer)
</code></pre>
<p>In diesem Fall stürzt das Programm ebenfalls ab, da der Text der in den buffer buffer um ein vielfaches größer ist als 1024(ist ja nur zum Testen).</p>
<p>Also was ist dann der Sinn von try-catch?</p>
<p>Danke Mondmann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157450</guid><dc:creator><![CDATA[Mondmann]]></dc:creator><pubDate>Thu, 19 Oct 2006 08:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 08:27:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>hier ein Artikel von Reyx zu dem Thema: <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-139074-and-start-is-0.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-139074-and-start-is-0.html</a></p>
<p>Der erklärt das ziemlich gut. Und ich muss nicht so viel schreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>MfG</p>
<p>GPC</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157453</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Thu, 19 Oct 2006 08:27:53 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 08:32:27 GMT]]></title><description><![CDATA[<blockquote>
<p>Dann mache ich ne if(divisor==0){&quot;Fehlermeldung&quot;}; - Schleife und alles ist gut.</p>
</blockquote>
<p>Was sind den diese coolen if-schleifen? Werden sie im neuen C++ Standard aufgenommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157457</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Thu, 19 Oct 2006 08:32:27 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 08:56:44 GMT]]></title><description><![CDATA[<p>Ok danke mal.<br />
Dann geht das leider nicht so einfach wie ich mir das vorgestellt hatte.<br />
Ich meinte so auf die schnelle verhindern zu können, daß mein Programm durch div. durch 0 abstürzt mit try-catch.<br />
Geht natürlich so nicht.<br />
Somit werde ich bei if..else bleiben,da für mich try-catch keine wirklichen Vorteile bringt.</p>
<p>Ich hatte das o.g. Beispiel aus einen C++ Tutorial.(<a href="http://www.willemer.de/informatik/cpp/exceptions.htm" rel="nofollow">http://www.willemer.de/informatik/cpp/exceptions.htm</a>)<br />
indem es so aufgezeigt wird, ohne abfragen des divisors nach 0.</p>
<p>Aber ich schätze mal ich habs einfach noch nicht verstanden...</p>
<p>Danke für die Hilfe, Mondmann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157464</guid><dc:creator><![CDATA[Mondmann]]></dc:creator><pubDate>Thu, 19 Oct 2006 08:56:44 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 09:24:34 GMT]]></title><description><![CDATA[<p>Du mußt im genannten Text einfach nur [1] beachten (Text ganz unten auf der Seite). Ich habe noch keinen Compiler gehabt, der Division durch 0 so abfangen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157494</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 19 Oct 2006 09:24:34 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 09:46:05 GMT]]></title><description><![CDATA[<p>Ok alles klar.</p>
<p>Ein Vorteil der mir jetzt einfällt, wäre folgender.</p>
<p>Ich fange ja alle möglichen Fehler ab. Wenns einen Fehler gibt, schreibe ich diesen in eine error.log Datei und kehre mit 0 auf der Funktion zurück.</p>
<p>Ich könnte dann hingehen und die gesamte Funktion in ein try() packen und bei einem Fehler, dessen Fehlertext werfen lassen.zB. throw(&quot;Fehler beim reservieren von Speicher. Fehler:1001&quot;);</p>
<p>Mit catch fange ich das dann ab und rufe die Funktion, die das in die log schreibt nur ein eiziges mal ab und schreibe &quot;return 0;&quot; dann auch nur ein einziges mal.</p>
<p>Somit könnte der Code übersichtlicher werden.</p>
<p>Wäre das ein evtl. Anwendungsgebiet?</p>
<p>Mondmann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157510</guid><dc:creator><![CDATA[Mondmann]]></dc:creator><pubDate>Thu, 19 Oct 2006 09:46:05 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 10:51:04 GMT]]></title><description><![CDATA[<p>Mondmann schrieb:</p>
<blockquote>
<p>oder was habe ich falsch verstanden???</p>
</blockquote>
<p>Nunja, wie GPC schon sagte, du kannst Exception nur mit catch fangen, wenn ein throw erfolgte. Division durch 0 ist eine Hardwareexception, sowas lässt sich nur unportabel abfangen. Mit WinAPI sollte sowas zB möglich sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157548</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Thu, 19 Oct 2006 10:51:04 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 13:28:52 GMT]]></title><description><![CDATA[<p>Mondmann schrieb:</p>
<blockquote>
<p>Ok alles klar.</p>
<p>Ein Vorteil der mir jetzt einfällt, wäre folgender.</p>
<p>Ich fange ja alle möglichen Fehler ab. Wenns einen Fehler gibt, schreibe ich diesen in eine error.log Datei und kehre mit 0 auf der Funktion zurück.</p>
</blockquote>
<p>Das ist genau die Methode, wie man es nicht machen sollte. Eine Funktion gibt eben keinen Fehlercode zurück, sondern wirft eine Exception. Dadurch muß der Aufrufer keinen Fehlercode abfragen sondern konzentriert sich auf seine eigentliche Aufgabe. Das schöne an Exceptions ist, daß diese über mehrere Funktionsaufrufe hinweg zurück geliefert werden. Dadurch kann ich an einer zentralen Stelle alle Fehler fangen, Nämlich da, wo ich sinnvollerweise darauf reagieren kann. Beispiel:</p>
<pre><code class="language-cpp">void aktion1()  // kein Rückgabecode oder ähnliches!
{
  // macht irgendwas
  if (irgendwas ist schief gelaufen)
    throw std::runtime_error(&quot;das hat nicht geklappt weil blah blah&quot;);
}

void aktion2()
{
  // eine Aktion, die aktion1 verwendet
  aktion1();
  // keine Fehlerbehandlung hier, da ich mich hier auf meine Aufgabe, aktion1() auszulösen konzentiere
}

void aktion3()
{
  // und noch eine schwachsinnige Funktion, die keine Fehlerbehandlung macht
  aktion1();
  aktion2();
  aktion2();
}

int main()
{
  try
  {
    aktion3();
  }
  catch (const std::exception&amp; e)
  {
    std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;
  }
}
</code></pre>
<p>Obwohl in der 3. Aufrufhierarchie was schief läuft, muß nur das Hauptprogramm den Fehler behandeln. &quot;aktion3&quot; beispielsweise muß nicht erst abfragen, ob aktion1 erfolgreich war, und nur dann aktion2 aufrufen, sondern kann sich darauf verlassen, daß aktion1 erfolgreich war, wenn aktion2 aufgerufen wird.</p>
<p>Hätte ich das ohne Exceptions programmiert, würde aktion3 etwa so aussehen:</p>
<pre><code class="language-cpp">int aktion3()
{
  int ret = aktion1();
  if (ret != 0)
    return ret;
  ret = aktion2();
  if (ret != 0)
    return ret;
  return aktion2();
}
</code></pre>
<p>Ich bin der Meinung, daß hier wesentlich schwieriger zu erkennen ist, welche aktionen hier ausgeführt werden. Die anderen Funktionen sind natürlich entsprechend um Abfragen und returncodes zu erweitern.</p>
<p>Wenn ich in einer Funktion jetzt auch noch was zurück geben will, dann muß ich mir einen Wert überlegen, welcher den Fehlercode darstellt, oder aber eine Referenz auf eine Fehlercodevariable übergeben.</p>
<p>Nehmen wir an, wir schreiben eine Funktion div, die sicher darauf reagieren soll, wenn eine Division durch 0 erfolgt. Mit Exceptions sieht das so aus:</p>
<pre><code class="language-cpp">double div(double a, double b)
{
  if (b == 0.0)
    throw NullDivision();  // ich nehme einfach mal an, wir hätten so eine Klasse definiert
  return a / b;
}

void f()   // hier wird das verwendet
{
  try
  {
    double d = div(5, 0);
    std::cout &lt;&lt; &quot;5/0=&quot; &lt;&lt; d &lt;&lt; std::endl;
  }
  catch (const NullDivision&amp;)
  {
    std::cerr &lt;&lt; &quot;oha - das geht nicht&quot; &lt;&lt; std::endl;
  }
}
</code></pre>
<p>Ohne Exceptions sähe das in etwa so aus:</p>
<pre><code class="language-cpp">double div(double a, double b, int&amp; fehler)
{
  if (b == 0.0)
  {
    fehler = 1;
    return 0.0;  // eigentlich will ich das ja gar nicht :(
  }
  else
  {
    fehler = 0;
    return a / b;
  }
}

void f()
{
  int fehler;
  double d = div(5, 0, fehler);
  if (fehler == 0)
  {
    std::cout &lt;&lt; &quot;5/0=&quot; &lt;&lt; d &lt;&lt; std::endl;
  }
  else if (fehler == 1)
  {
    std::cerr &lt;&lt; &quot;oha - das geht nicht&quot; &lt;&lt; std::endl;
  }
  else
  {
    // jetzt weiß ich nicht mehr weiter
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1157670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157670</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Thu, 19 Oct 2006 13:28:52 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 16:55:15 GMT]]></title><description><![CDATA[<p>MSVC unterstützt z.B. asynchrone Exceptions in synchrone zu verwandeln, was wirklich SEHR COOL ist. Soll heissen: du installierst einen Handler, welcher aufgerufen wird wenn eine asynchrone Exception (division by zero, access violation, protection fault, ...) auftritt, und da drinn kannst du dann eine normale C++ Exception schmeissen die du auch ganz normal mit catch fangen kannst. Coole Sache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157838</guid><dc:creator><![CDATA[Plotzenhotz]]></dc:creator><pubDate>Thu, 19 Oct 2006 16:55:15 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Thu, 19 Oct 2006 18:12:21 GMT]]></title><description><![CDATA[<p>Hallo tntnet.</p>
<p>Vielen Dank für Deine gute und sehr ausführliche Antwort die den Unterschiede sehr deutlich macht.</p>
<p>Ich habe bereits eine größere Funktion &quot;umgewandelt&quot; und werfe jetzt eben bei jedem Fehler etwas in der Gegend herum:-)<br />
Und ich muss echt sagen es ist um ein vielfaches einfacher und übersichtlicher. Ich muss mich jetzt nicht mehr drum kümmern was die Funktion zurückgibt und dies entsprechend abfangen sondern fange den Fehler einfach ein und gebe ihn aus.<br />
Dolle Sache.</p>
<p>Vielen Dank für die &quot;Erleuchtung&quot;.<br />
Grüße Mondmann</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157881</guid><dc:creator><![CDATA[Mondmann]]></dc:creator><pubDate>Thu, 19 Oct 2006 18:12:21 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Fri, 20 Oct 2006 07:09:31 GMT]]></title><description><![CDATA[<p>Mondmann schrieb:</p>
<blockquote>
<p>...<br />
Und ich muss echt sagen es ist um ein vielfaches einfacher und übersichtlicher. ...</p>
</blockquote>
<p>Ja, exceptions gehören zu den Dingen, die ich am meisten vermisse, wenn ich in C (ohne &quot;++&quot;) arbeiten muß (dann noch &quot;overloading&quot; und bisweilen templates ... die meisten anderen Sachen kann man noch einigermaßen emulieren).</p>
<p>Schon eine tolle Sache !</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1158094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1158094</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 20 Oct 2006 07:09:31 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Fri, 20 Oct 2006 09:03:16 GMT]]></title><description><![CDATA[<p>Mir sind Destruktoren wichtig. Das nimmt Dir das Resourcenhandling ab.</p>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1158157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1158157</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 20 Oct 2006 09:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen zu try..catch on Fri, 20 Oct 2006 09:15:30 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Mir sind Destruktoren wichtig. Das nimmt Dir das Resourcenhandling ab.</p>
<p>Tntnet</p>
</blockquote>
<p>Stimmt !<br />
... eigentlich fehlt alles, was C++ hat und C nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Und den Kontrollfluß bei exceptions kann man kaum sinnvoll nachbauen, während man bei einigem Anderen wenigsten noch &quot;ähnliche Krücken&quot; bauen kann.<br />
Initialisierung/Abräumen wie per Ctor/Dtor geht noch halbwegs (finde ich) - ist zwar lästig (so wie die Funktionsbenennung ohne overloadiung und namespaces), aber wenigstens noch irgendwie abbildbar.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1158162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1158162</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 20 Oct 2006 09:15:30 GMT</pubDate></item></channel></rss>