Catch kommt nicht zum tragen
-
Hallo
Wo ist dein Problem?
for(int i=0;i<CSpinEdit1->Value+1;i++) { try { messwert[i]=StrToFloat(Grid1->Cells[2][i+1]); } catch(...) { MessageBox(Handle, AnsiString("Bitte Meßwert ") + IntToStr(i+1) + "prüfen! ", "Fehler", MB_OK|MB_ICONEXCLAMATION); } }
bis bald
akari
-
Die Catch-Anweisung wird nie ausgeführt auch wenn die Bedingung erfüllt ist.
Geht das nicht innerhalb einer for-Schleife?
-
@Akari Ich bekomme:
[C++ Fehler] Unit1.cpp(4690): E2285 Keine Übereinstimmung für 'MessageBoxA(void *,AnsiString,char *,long)' gefundenwas aber mit dem eigentlichen Problem wohl nichts zu tun hat.
-
Hallo
Hab nicht darauf geachtet was für eine MessageBox-Variante du benutzt...
Application->MessageBox(AnsiString("Bitte Meßwert ") + IntToStr(i+1) + "prüfen! ", "Fehler", MB_OK|MB_ICONEXCLAMATION);
Aber trotz allem kann ich dein Problem nicht nachvollziehen. Natürlich werden auch die Exceptions von StrToFloat von try/catch aufgefangen, der gezeigte Codeauschnitt ist korrekt.
bis bald
akari
-
Danke, das habe ich dann auch korrigiert.
Das Problem scheint nur dann aufzutreten wenn der Code in einer Action liegt.
Wenn ich den Code einen Button zuordne wird er richtig ausgeführt.
Woher das kommt, verstehe ich nicht.
-
Klappt es, wenn du die Exception gezielt fängst:
catch (Exception& e) { ... }
?
-
Gibt es die Zelle im StringGrid überhaupt?
-
Wenn der Block mit der Try-Anweisung zuerst in der Methode steht klappt es:
void __fastcall TForm1::Action_BerechnenExecute(TObject *Sender) { for(int i=0;i<CSpinEdit1->Value+1;i++) { try { messwert[i]=StrToFloat(Grid1->Cells[2][i+1]); } catch(...) { AnsiString fehlerwert="Bitte Messwert " + IntToStr(i+1) + " prüfen! "; Application->MessageBox(fehlerwert.c_str() , "Fehler", MB_OK|MB_ICONEXCLAMATION); } } int stufen=CSpinEdit1->Value; Series1->AddXY(0,StrToFloat(Grid1->Cells[2][1]),"",clGreen); Series31->AddXY(0,StrToFloat(Grid1->Cells[2][1]),"",clGreen); Series2->AddXY(0,StrToFloat(Grid1->Cells[3][1]),"",clGreen); Series32->AddXY(0,StrToFloat(Grid1->Cells[3][1]),"",clGreen); for (int i=1;i<stufen+1;i++) { if (ComboBox_Unit->ItemIndex==1) { Series1->AddXY((StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue)) ,StrToFloat(Grid1->Cells[2][i+1]),"",clGreen); Series31->AddXY((StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue)),StrToFloat(Grid1->Cells[2][i+1]),"",clGreen); Series2->AddXY((StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue)),StrToFloat(Grid1->Cells[3][i+1]),"",clGreen); Series32->AddXY((StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue)),StrToFloat(Grid1->Cells[3][i+1]),"",clGreen); } if (ComboBox_Unit->ItemIndex!=1) { Series1->AddXY(StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue),StrToFloat(Grid1->Cells[2][i+1]),"",clGreen); Series31->AddXY(StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue),StrToFloat(Grid1->Cells[2][i+1]),"",clGreen); Series2->AddXY(StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue),StrToFloat(Grid1->Cells[3][i+1]),"",clGreen); Series32->AddXY(StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue),StrToFloat(Grid1->Cells[3][i+1]),"",clGreen); } else; }
Wenn der aber am Ende steht kommt niemals eine Exception:
void __fastcall TForm1::Action_BerechnenExecute(TObject *Sender) { int stufen=CSpinEdit1->Value; Series1->AddXY(0,StrToFloat(Grid1->Cells[2][1]),"",clGreen); Series31->AddXY(0,StrToFloat(Grid1->Cells[2][1]),"",clGreen); Series2->AddXY(0,StrToFloat(Grid1->Cells[3][1]),"",clGreen); Series32->AddXY(0,StrToFloat(Grid1->Cells[3][1]),"",clGreen); for (int i=1;i<stufen+1;i++) { if (ComboBox_Unit->ItemIndex==1) { Series1->AddXY((StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue)) ,StrToFloat(Grid1->Cells[2][i+1]),"",clGreen); Series31->AddXY((StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue)),StrToFloat(Grid1->Cells[2][i+1]),"",clGreen); Series2->AddXY((StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue)),StrToFloat(Grid1->Cells[3][i+1]),"",clGreen); Series32->AddXY((StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue)),StrToFloat(Grid1->Cells[3][i+1]),"",clGreen); } if (ComboBox_Unit->ItemIndex!=1) { Series1->AddXY(StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue),StrToFloat(Grid1->Cells[2][i+1]),"",clGreen); Series31->AddXY(StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue),StrToFloat(Grid1->Cells[2][i+1]),"",clGreen); Series2->AddXY(StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue),StrToFloat(Grid1->Cells[3][i+1]),"",clGreen); Series32->AddXY(StrToFloat((i-1)*CSpinEdit3->FloatValue+CSpinEdit2->FloatValue),StrToFloat(Grid1->Cells[3][i+1]),"",clGreen); } else; for(int i=0;i<CSpinEdit1->Value+1;i++) { try { messwert[i]=StrToFloat(Grid1->Cells[2][i+1]); } catch(...) { AnsiString fehlerwert="Bitte Messwert " + IntToStr(i+1) + " prüfen! "; Application->MessageBox(fehlerwert.c_str() , "Fehler", MB_OK|MB_ICONEXCLAMATION); } }
Das ist ein Zustand mit dem ich zwar leben kann, aber ich hätte ihn schon gerne verstanden.
-
Ach du meine Nase...
gibts da nicht was von RatioPharm?
Wozu soll das gut sein:
else;
???
Wenn du nicht willst, dass etwas ausgeführt wird wenn die if-Anweisung nicht erfüllt ist, dann lass' das else einfach weg.
heutmalhier schrieb:
Wenn der Block mit der Try-Anweisung zuerst in der Methode steht klappt es [...] Wenn der aber am Ende steht kommt niemals eine Exception.
In Version 2 fehlt beiden for-Schleifen am Ende eine Klammer?! Hmm... und in Version 1 fehlt die schliessende Klammer für den gesamten Methoden-Rumpf.
-
Schon mal drauf geachtet, in welcher Zeile der Fehler passiert?
-
ok, stimmt es fehlen ein paar Klammern, ich wollte aber nicht alles Posten.
Das Kernproblem ist aber nicht behandelt: Warum die try-Anweisung nur dann funktioniert wenn sie am Anfang in der Methode steht.
Bei mir im Projekt funktionieren ja beide Möglichkeiten, jedoch einmal ohne das die Exception von catch abgefangen wird, sonst habe ich keinerlei Fehlermeldungen.
-
Und noch mal:
Joe_M. schrieb:
Schon mal drauf geachtet, in welcher Zeile der Fehler passiert?
Überleg doch mal, so schwer ist das doch nicht.
-
Sorry, ich komme nicht dahinter, manchmal ist man ja für banale Dinge blind.
Trotzdem wäre ich dankbar für die Lösung.
-
Du hast zwei Schleifen im Programm, die jeweils StrToFloat verwenden um die Inhalte in Zahlen zu wandeln. Um die eine Schleife hast Du ein try-catch, um die andere nicht. Und wenn Du dann zuerst die Schleife ohne try-catch ausführst, kracht es...
-
Achso, danke das wußte ich nicht. Es passiert aber auch nichts, außer das die Exception nicht abgefangen wird, sonst hat halt alles funktioniert.
Bin halt noch weit weg vom Profi