Try Catch
-
Hallo,
eine Frage zu Try Catch.
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { blah = new unsigned char[10]; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { try { blah[100000] = 10; } catch(exception_deklaration) { Application->MessageBox(".......",".......",MB_OK); } }Wie muss die Exeption_deklaration sein, werde aus der Borland Hilfe nicht
richtig schlau.
-
Z.B. (Exception &e). Allerdings wird bei deinem Arrayzugriff nur mit Glück eine Exception geworfen (Access Violation) - und das ist eine Eigenheit vom BCB. Mit anderen Programmen wird dein Programm einfach abschmieren. Oder es passiert gar keine Exception, du überschreibst dir irgendwo was im Speicher, und nachher schmiert dein Programm ab ;).
-
Das Array weiß ja nicht wie gross es ist, kann also so nicht feststellen, dass du hier auf nicht allozierten Speicher zugreifst. Wie Ringding schon sagte überschreibst du dir hier eine andere (evtl. genutzte) Speicherstelle. Wenn dein Programm dann darauf zugreifen will kann es abschmieren (also viel später).
-
Hallo
Zur Deklaration : schau dir doch den Code der Projekt-Datei an, dort ist der Haupt Try-Catch Block.
Zum Array : Wenn du DynamicArray oder std::vector nimmst, werden ordentliche Out-Of-Range Exceptions geworfen.bis bald
akari
-
Aber auch nur, wenn man at() und nicht [] verwendet.
-
Hallo,
So wird auf jede Exception reagiert, egal welche :
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { blah = new unsigned char[10]; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { try { blah[100000] = 10; } catch( ... ) { Application->MessageBox(".......",".......",MB_OK); } }Bis dann denn,

Nash
-
Das ist schon richtig, aber ein Speicherzugriffsfehler ist in sämtlichen anderen Umgebungen keine Exception. Das ist nur in BCB so.
-
ClientSocket1->Active = false; ClientSocket1->Port = 500; ClientSocket1->Address = "localhost"; ClientSocket1->Host = "localhost"; try { ClientSocket1->Active = true; } catch( ... ) { Application->MessageBox("Cannot Connect","Client Error", MB_OK); }Wie kann ich die Socket Exeption "Asynchroner Socket-Fehler 10061" abfangen.
Mit der wie oben gezeigten Methode Funkt es nicht.
-
guck mal in die bcb-hilfe zum OnError-Ereignis des TClientSocket
-
Das OnError Ereignis nutz ich schon, verhindert aber trotzdem nicht die
Exeption, gibt es da nicht eine Möglichkeit in dem OnError Ereignis die
Exeption zu löschen?
Habe das schon mal irgendwo gelesen.
-
wenn du in der bcb hilfe zum on error ereignis geschaut hättest wüsstes du wie man die exception verhindern kannst.
aber mal ein tip: ErrorCode
-
Manchmal steht ja doch was Sinnvolles in der Borland Hilfe.
void __fastcall TForm1::ClientSocket1Error(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { Edit3->Text = "INVALID CONNECTION"; ClientSocket1->Active = false; ErrorCode = 0; }Hätte das ganze auch schon mal genauer betrachten können, zumal eine
Referenz auf ErrorCode mit übergeben wird, habe aber schon soviel
verwirrendes Zeugs in der Borland Hilfe gelesen das ich manchmal schon
garnicht mehr weiterlese.Danke für die Hilfe.
-
wg Hilfe:
schonmal hier geguckt: http://www.junix.ch/bcb/help/hilfe.html ?