<?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[try + catch wollen nicht so wie ich...]]></title><description><![CDATA[<p>Moin!</p>
<p>Ich muss in einer bestehenden Funktion eine Fehlerbehandlung einbauen, da ein Funktionsaufruf (SCSIScanFindSCSIScannerWithDialog) eine Ausnahme erzeugen kann, nämlich, wenn der Scanner nicht angeschlossen/eingeschaltet ist bzw. während der Suche nach dem Scanner per Button abgebrochen wird.</p>
<p>Zu diesem Zweck habe ich testweise try-/catch-Blöcke wie folgt gebildet:</p>
<pre><code class="language-cpp">void CScanDlg::Init() {
  try {
    char sTmp[128];
    //
    CDialog::OnInitDialog();
    //
    fontLog.DeleteObject();
    fontLog.CreatePointFont(80,&quot;Courier New&quot;);
    //
    if(SCSIScanFindSCSIScannerWithDialog(0,&amp;Hostadapter,&amp;Target,&amp;Lun)!=0) {
      MessageBox(&quot;Scanner nicht gefunden oder abgebrochen!&quot;,&quot;Fehler&quot;);
      cPleaseWait.ShowWindow(SW_HIDE);
      this-&gt;DestroyWindow();
      return;
    }
    //
    int rtn = SCSIScanOpen(Hostadapter,Target,Lun,IOPort,SCSIScanIfSCSIPassThrough,&amp;pSCSIScanHandle);
    if(rtn!=0) {
      MessageBox(&quot;SCSIScanOpen!=0&quot;);
      this-&gt;DestroyWindow();
      return;
    }
    //
    m_SliderLeft.SetLineSize(5);
    m_SliderLeft.SetPageSize(500);
    m_SliderLeft.SetRange(0,iMaxPixelX,true);
    m_SliderLeft.SetPos(0);
    //
    m_SliderTop.SetLineSize(5);
    m_SliderTop.SetPageSize(500);
    m_SliderTop.SetRange(0,iMaxPixelY,true);
    m_SliderTop.SetPos(0);
    //
    m_SliderWidth.SetLineSize(5);
    m_SliderWidth.SetPageSize(500);
    m_SliderWidth.SetRange(0,iMaxPixelX,true);
    m_SliderWidth.SetPos(iMaxPixelX);
    //
    m_SliderHeight.SetLineSize(5);
    m_SliderHeight.SetPageSize(500);
    m_SliderHeight.SetRange(0,iMaxPixelY,true);
    m_SliderHeight.SetPos(iMaxPixelY);
    //
    rcScanRect.X=rcScanRectOrgSize.X=0;
    rcScanRect.Y=rcScanRectOrgSize.Y=0;
    rcScanRect.Width=rcScanRectOrgSize.Width=iMaxPixelX/iScanRectZoom;
    rcScanRect.Height=rcScanRectOrgSize.Height=iMaxPixelY/iScanRectZoom;
  }catch (...) {
    MessageBox(&quot;Catched!&quot;);
    cPleaseWait.ShowWindow(SW_HIDE);
    return;
  }
}
</code></pre>
<p>Die Auswirkungen sind nun folgendermaßen: das Programm stürzt zwar nicht mehr ab, es wird jedoch nicht der Code im catch-Block abgearbeitet. Ebenso wird der Code ab der Funktion SCSIScanFindSCSIScannerWithDialog (die ja die Ausnahme erzeugt) nicht ausgeführt. Im Klartext: Es wird einfach kein weiterer Code der Funktion ausgeführt! Weder wird irgendeine MessageBox angezeigt, noch wird der &quot;Bitte warten&quot;-Dialog (cPleaseWait) geschlossen.</p>
<p>Wieso?? Wie muss ich die Fehlerbehandlung richtig implementieren? Wo ist der Fehler?</p>
<p>Gruß Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/195983/try-catch-wollen-nicht-so-wie-ich</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Apr 2026 10:16:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195983.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Oct 2007 08:29:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to try + catch wollen nicht so wie ich... on Wed, 24 Oct 2007 08:29:09 GMT]]></title><description><![CDATA[<p>Moin!</p>
<p>Ich muss in einer bestehenden Funktion eine Fehlerbehandlung einbauen, da ein Funktionsaufruf (SCSIScanFindSCSIScannerWithDialog) eine Ausnahme erzeugen kann, nämlich, wenn der Scanner nicht angeschlossen/eingeschaltet ist bzw. während der Suche nach dem Scanner per Button abgebrochen wird.</p>
<p>Zu diesem Zweck habe ich testweise try-/catch-Blöcke wie folgt gebildet:</p>
<pre><code class="language-cpp">void CScanDlg::Init() {
  try {
    char sTmp[128];
    //
    CDialog::OnInitDialog();
    //
    fontLog.DeleteObject();
    fontLog.CreatePointFont(80,&quot;Courier New&quot;);
    //
    if(SCSIScanFindSCSIScannerWithDialog(0,&amp;Hostadapter,&amp;Target,&amp;Lun)!=0) {
      MessageBox(&quot;Scanner nicht gefunden oder abgebrochen!&quot;,&quot;Fehler&quot;);
      cPleaseWait.ShowWindow(SW_HIDE);
      this-&gt;DestroyWindow();
      return;
    }
    //
    int rtn = SCSIScanOpen(Hostadapter,Target,Lun,IOPort,SCSIScanIfSCSIPassThrough,&amp;pSCSIScanHandle);
    if(rtn!=0) {
      MessageBox(&quot;SCSIScanOpen!=0&quot;);
      this-&gt;DestroyWindow();
      return;
    }
    //
    m_SliderLeft.SetLineSize(5);
    m_SliderLeft.SetPageSize(500);
    m_SliderLeft.SetRange(0,iMaxPixelX,true);
    m_SliderLeft.SetPos(0);
    //
    m_SliderTop.SetLineSize(5);
    m_SliderTop.SetPageSize(500);
    m_SliderTop.SetRange(0,iMaxPixelY,true);
    m_SliderTop.SetPos(0);
    //
    m_SliderWidth.SetLineSize(5);
    m_SliderWidth.SetPageSize(500);
    m_SliderWidth.SetRange(0,iMaxPixelX,true);
    m_SliderWidth.SetPos(iMaxPixelX);
    //
    m_SliderHeight.SetLineSize(5);
    m_SliderHeight.SetPageSize(500);
    m_SliderHeight.SetRange(0,iMaxPixelY,true);
    m_SliderHeight.SetPos(iMaxPixelY);
    //
    rcScanRect.X=rcScanRectOrgSize.X=0;
    rcScanRect.Y=rcScanRectOrgSize.Y=0;
    rcScanRect.Width=rcScanRectOrgSize.Width=iMaxPixelX/iScanRectZoom;
    rcScanRect.Height=rcScanRectOrgSize.Height=iMaxPixelY/iScanRectZoom;
  }catch (...) {
    MessageBox(&quot;Catched!&quot;);
    cPleaseWait.ShowWindow(SW_HIDE);
    return;
  }
}
</code></pre>
<p>Die Auswirkungen sind nun folgendermaßen: das Programm stürzt zwar nicht mehr ab, es wird jedoch nicht der Code im catch-Block abgearbeitet. Ebenso wird der Code ab der Funktion SCSIScanFindSCSIScannerWithDialog (die ja die Ausnahme erzeugt) nicht ausgeführt. Im Klartext: Es wird einfach kein weiterer Code der Funktion ausgeführt! Weder wird irgendeine MessageBox angezeigt, noch wird der &quot;Bitte warten&quot;-Dialog (cPleaseWait) geschlossen.</p>
<p>Wieso?? Wie muss ich die Fehlerbehandlung richtig implementieren? Wo ist der Fehler?</p>
<p>Gruß Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391009</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:29:09 GMT</pubDate></item><item><title><![CDATA[Reply to try + catch wollen nicht so wie ich... on Wed, 24 Oct 2007 08:39:31 GMT]]></title><description><![CDATA[<p>Du solltest mal nachsehen welche Art von Exception geworfen wird und diese als Parameter für den catch block nehmen.<br />
Ist es als Bsp. eine normale std::exception dann schreibst halt</p>
<pre><code>try {}
catch(std::exception&amp; e)
{}
</code></pre>
<p>Probiers einfach mal.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391016</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:39:31 GMT</pubDate></item><item><title><![CDATA[Reply to try + catch wollen nicht so wie ich... on Wed, 24 Oct 2007 08:39:40 GMT]]></title><description><![CDATA[<p>Ergänzung:</p>
<p>Wenn ich mit dem Debugger schrittweise durch das Programm gehe, geht er auch in den catch-Block rein. Der Debug-Zeiger steht dann auf der MessageBox. Diese wird jedoch tatsächlich, wie gesagt, nicht ausgeführt. Ebenso wie der restliche Teil des Blocks.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391017</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:39:40 GMT</pubDate></item><item><title><![CDATA[Reply to try + catch wollen nicht so wie ich... on Wed, 24 Oct 2007 08:46:31 GMT]]></title><description><![CDATA[<p>Wie kann ich denn herausfinden, welche Art von Exception geworfen wurde? Ich habe bislang noch nie mit try/catch zu tun gehabt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391024</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 24 Oct 2007 08:46:31 GMT</pubDate></item><item><title><![CDATA[Reply to try + catch wollen nicht so wie ich... on Wed, 24 Oct 2007 09:03:30 GMT]]></title><description><![CDATA[<p>Rausfinden kannst du das in der Doku zu den Funktionen die du verwendest.<br />
Aber wenn er im Debugger in den catch-Handler reingeht und sonst nicht, ist das wunderlich. Naja (...) heisst ja eigentlich auch ALLE exceptions. Hast du mal nen kompletten Rebuild probiert?<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391035</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391035</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:03:30 GMT</pubDate></item><item><title><![CDATA[Reply to try + catch wollen nicht so wie ich... on Wed, 24 Oct 2007 09:16:47 GMT]]></title><description><![CDATA[<p>Bist du sicher, dass du nicht versuchst, die Release-Variante zu debuggen? Dann gibt es schon mal komische Effekte. Aber die MessageBox sollte auf jeden Fall kommen.</p>
<p>Probiers mal mit der allg. Exception und gib die Fehlermeldung aus, z.B.:</p>
<pre><code class="language-cpp">catch(CException* pEx)
	{
		char expbuf[256];
		pEx-&gt;GetErrorMessage((LPTSTR)expbuf, 255);
		pEx-&gt;Delete();
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1391041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391041</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:16:47 GMT</pubDate></item><item><title><![CDATA[Reply to try + catch wollen nicht so wie ich... on Wed, 24 Oct 2007 10:13:54 GMT]]></title><description><![CDATA[<p>Rebuild habe ich versucht, ohne Verbesserung. Auch das direkte Ausführen der EXE ohne Debugger macht keinen Unterschied.</p>
<p>Ich habe eben allerdings einen sehr komischen Umstand entdeckt:</p>
<p>Wenn ich die Ausnahme verursache (Scanner ist aus), geht er in den catch-Block. Der Debug-Zeiger steht auf der MessageBox, die jedoch nicht ausgeführt wird.</p>
<p>Ich bin wieder in meinem Hauptdialog (der die ganze Zeit offen ist). Der &quot;Bitte warten&quot;-Dialog (sollte ja eigentlich zerstört werden) ist natürlich weiterhin da (als TopMost sehr nervig).</p>
<p>Versuche ich nun, die gleiche Funktion wieder auszuführen (so dass der Dialog ScanDlg geöffnet wird), passiert gar nichts.</p>
<p>Führe ich eine ganz andere Funktion aus (aktuelles Bild speichern, ohne Dialog), wird diese korrekt ausgeführt. Gleichzeitig erscheint aber plötzlich die zuvor vermisste MessageBox! Es wird also mit deutlicher Verzögerung (und einem kleinen Schubser meinerseits) doch der komplette catch-Block ausgeführt, nur eben nicht an einem Stück. Häähh?!</p>
<p>Danach stürzt das Programm ab.</p>
<p>EDIT: Und zwar stürzt es bei dem Versuch ab, den Dialog neu zu erstellen (cScanDlg.Create()), was sonst natürlich klappt, da der Dialog korrekt zerstört wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391045</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 24 Oct 2007 10:13:54 GMT</pubDate></item><item><title><![CDATA[Reply to try + catch wollen nicht so wie ich... on Wed, 24 Oct 2007 09:27:39 GMT]]></title><description><![CDATA[<p>Tester2 schrieb:</p>
<blockquote>
<p>Bist du sicher, dass du nicht versuchst, die Release-Variante zu debuggen? Dann gibt es schon mal komische Effekte. Aber die MessageBox sollte auf jeden Fall kommen.</p>
<p>Probiers mal mit der allg. Exception und gib die Fehlermeldung aus, z.B.:</p>
<pre><code class="language-cpp">catch(CException* pEx)
	{
		char expbuf[256];
		pEx-&gt;GetErrorMessage((LPTSTR)expbuf, 255);
		pEx-&gt;Delete();
	}
</code></pre>
</blockquote>
<p>Ich habe dies versucht, jetzt geht er allerdings gar nicht mehr in den catch-Block rein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391052</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:27:39 GMT</pubDate></item><item><title><![CDATA[Reply to try + catch wollen nicht so wie ich... on Wed, 24 Oct 2007 09:33:24 GMT]]></title><description><![CDATA[<p>Ach ja, ich kompiliere natürlich als Debug, das kann's also auch nicht sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1391057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1391057</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 24 Oct 2007 09:33:24 GMT</pubDate></item></channel></rss>