Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Try...Except zeigt keine Wirkung (https://www.delphipraxis.net/145796-try-except-zeigt-keine-wirkung.html)

Simme 8. Jan 2010 15:03


Try...Except zeigt keine Wirkung
 
Hallo an alle!

Ich bin heute schonmal mit einem Problem aus diesem Programm gekommen. Ich habe schon seit einiger Zeit das Gefühl, dass die Try-Except-Anweisungen nicht so richtig funktionieren bei mir, oder ich wende sie falsch an. Vielleicht könnt ihr mir weiterhelfen.

Hier mein Code:
Delphi-Quellcode:
If ((GetAsyncKeyState(VK_NUMPAD0)) <> 0) Then
    begin
      Try
      bombesp1[laufzahl_bombe1] := TImage.Create(Form1);
      with bombesp1[laufzahl_bombe1] do
      begin
        Visible := true;
        Top  := 64;
        Left := 200;
        Width := 49;
        Height:= 65;
        Stretch := True;
        Proportional := True;
        Name := 'Bombe' + IntToStr(laufzahl_bombe1) + '_SP1';
        Parent := Form1;
        Picture.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'bombe.bmp');
      end;
      Except
        bombesp1[laufzahl_bombe1].Left := Image1.Left;
        bombesp1[laufzahl_bombe1].Top := Image1.Top;
        bombesp1[laufzahl_bombe1].Visible := True;
        Delay(2000);
        bombesp1[laufzahl_bombe1].Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'bombe_explodiert.bmp');
      end;
    end;
Wäre für jede Hilfe dankbar.

Simme

Matze 8. Jan 2010 15:04

Re: Try...Except zeigt keine Wirkung
 
Hallo,

was geht denn nicht?
Und du weißt, dass "except" nur dann ausgeführt wird, wenn ein schwerer Fehler im try-Abschnitt auftritt (Zugriffverletzung o.ä.)?

Grüße, Matze

Simme 8. Jan 2010 15:09

Re: Try...Except zeigt keine Wirkung
 
Also, kompilierbar ist das ganze. Aber wenn ich diesen Abschnitt praktisch so ausführe, dass er den Try-teil überspringen müsste, kommt ein Fehler: Und er sagt mir, dass das Image mit diesem Namen bereits existiert. Das ist klar, aber genau deshalb sollte er diesen Teil überspringen und direkt zur Except-Anweisung übergehen. Aber er gibt mir die Fehlermeldung. Warum?

Gruß,
Simme

Andreas L. 8. Jan 2010 15:12

Re: Try...Except zeigt keine Wirkung
 
Zitat:

Zitat von Simme
Also, kompilierbar ist das ganze. Aber wenn ich diesen Abschnitt praktisch so ausführe, dass er den Try-teil überspringen müsste, kommt ein Fehler: Und er sagt mir, dass das Image mit diesem Namen bereits existiert. Das ist klar, aber genau deshalb sollte er diesen Teil überspringen und direkt zur Except-Anweisung übergehen. Aber er gibt mir die Fehlermeldung. Warum?

Gruß,
Simme

Die Meldung wird dir nur im Debugger angezeigt. Startest du die Anwendung außerhalb von Delphi siehts nix :wink:

Matze 8. Jan 2010 15:13

Re: Try...Except zeigt keine Wirkung
 
Richtig,

du kannst das in den Optionen auch umstellen: Tools -> Optionen und da irgendwas mit "Bei Delphi-Sprachexceptions stoppen" (Haken entfernen).

Grüße, Matze

Andreas L. 8. Jan 2010 15:15

Re: Try...Except zeigt keine Wirkung
 
Zitat:

Zitat von Matze
du kannst das in den Optionen auch umstellen: Tools -> Optionen und da irgendwas mit "Bei Delphi-Sprachexceptions stoppen" (Haken entfernen).

Nicht empfehlenswert, insbesondere für einen Anfänger!

Sir Rufo 9. Jan 2010 00:02

Re: Try...Except zeigt keine Wirkung
 
Nur mal so am Rande ...

einen try...except ins konzept einzubauen ist mehr als böse.
das ist eigentlich dafür gedacht fehler kontrolliert abzufangen um das programm in einem definierten zustand zu belassen.

ob du ein TImage erzeugen musst oder nicht kannst du auch "normal" ohne exception abfragen.

z.B. ist Delphi-Referenz durchsuchenAssigned dein freund

P.S.: ich bin ja ein freund der bildlichen sprache:

so wie du das try...except hier einsetzt, vermute ich mal, dass ihr vor eurer haustür ein minienfeld habt.
nein, gegen besuch habt ihr nix, aber niemend vergisst mehr sein kommen bemerkbar zu machen :mrgreen:

Simme 9. Jan 2010 10:50

Re: Try...Except zeigt keine Wirkung
 
Also danke für die vielen Vorschläge und so.
Mir ging es eigentlich nicht darum, dass ich die Fehlermeldung wegbekomme, sondern darum, dass die Try...Except-Anweisung so funktioniert, wie sie es soll. Aber selbst wenn die Fehlermeldung nicht kam: Er hat dann eben gar nichts aus der Anweisung gemacht: Auch nicht den Except-Teil.
Aber gut, ch suche bei sowas dann immer nach Alternativen. Ich habe auch eine gefunden. Ich habe das ganze durch eine If...Then-Anweisung ersetzt. Und jetzt funktioniert alles so, wie es soll. ;)

Also trotzdem danke!

Lg
Simme

PS: @Rufo: Ich kann ja nichts dafür, wenn mir mein Info-Lehrer mir die Verwendung der Exception falsch erklärt. Und im Übrigen funktioniert diese Anweisung selbst bei den einfachsten Sachen bei mir nicht. Aber es gibt eigentlich immer Alternativen. Man muss sie eben nur finden. :D

alzaimar 9. Jan 2010 11:09

Re: Try...Except zeigt keine Wirkung
 
Zitat:

Zitat von Sir Rufo
einen try...except ins konzept einzubauen ist mehr als böse.

Wo hast Du das denn her?
Exceptions sind nicht böse. Also ist das Verwenden von Exceptions auch nicht böse. Und das Abfangen schon gar nicht. Exceptions sind ein 'best practice', um die Behandlung der Ausnahmen (daher der Name) übersichtlich und strukturiert zu implementieren. Die Alternative wäre die Verwendung von Returncodes und was das für Spaghetticode ergibt (IF THEN ELSE IF THEN ELSE ....) wissen all die, die mal mit der Win-API arbeiten durften.

Zitat:

Zitat von Sir Rufo
das ist eigentlich dafür gedacht fehler kontrolliert abzufangen um das programm in einem definierten zustand zu belassen

Das ist nur ein kleiner Aspekt des Exception-Konzeptes.
Immer, wenn Du eine Methode einer niedrigeren Klasse aufrufst, musst Du diese Aufrufe in Try..Except kapseln und die Exceptions, die diese Methode wirft bzw. werfen kann, in die eigenen (abstrakteren) Exceptions transformieren.
Das ist eine Grundregel des Clean Coding, oder Quasar-Konzept oder wie man auch immer das nennen will.
Das Try/Except- ein Muss, um robuste und wartbare Software zu schreiben.

Allerdings kann man das auch -wie jedes Werkzeug- falsch verwenden:
Zitat:

so wie du das try...except hier einsetzt, vermute ich mal, dass ihr vor eurer haustür ein minienfeld habt.
nein, gegen besuch habt ihr nix, aber niemend vergisst mehr sein kommen bemerkbar zu machen :mrgreen:
Das lassen wir so stehen.

Muetze1 9. Jan 2010 11:59

Re: Try...Except zeigt keine Wirkung
 
Zitat:

Zitat von Sir Rufo
ob du ein TImage erzeugen musst oder nicht kannst du auch "normal" ohne exception abfragen.

z.B. ist Delphi-Referenz durchsuchenAssigned dein freund

Er legt als aller erste Anweisung eine TImage Instanz durch einen Constructoraufruf an. Wenn nun das Anlegen der Instanz nicht erfolgreich durchgeführt werden kann (z.B: Speichermanager hat kein Speicher mehr, zu wenig GDI Handles, etc), dann kann dies nur durch eine Exception bekannt gegeben werden. Eine Exception ist die einzige Möglichkeit das Anlegen eines Constructors abzubrechen. Die Variable dann mit Assigned() abzuprüfen ist ein Witz (ich liebe keine bildliche, aber ausdrucksstarke Sprache), weil diese Anweisung nur erreicht wird, wenn der Constructor nicht abgebrochen wird. Und somit ist sie hinfällig, weil dann ist immer eine Instanz vorhanden.

/EDIT: Ok, ich habe mich verlesen, du wolltest mit Assigned() prüfen ob nicht schon eine Instanz da ist. Aber das war für mich nun unverständlich, da es keine Exception gibt wenn man die Referenzen von vorhandenen Instanzen überschreibt. Somit wäre der gesamte try/except Block nicht für diese Prüfung gedacht. Also alles hinfällig, Sir Rufo.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz