Catch kommt nicht zum tragen



  • 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 😕


Anmelden zum Antworten