Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Für Fragen von Einsteigern und Programmieranfängern...
idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von idefix »

Hallo!

Ich bin absoluter Neuling in Lazarus.
Mein letztes Delphi Programm habe ich 2004 geschrieben.
Da ich somit alles vergessen habe, mache ich mich gerade über diverse Tutorials her.

Da bin ich hier bei Exceptions gelandet:
http://www.delphi-treff.de/tutorials/ob ... xceptions/
Man vermeidet solche Ausnahmen, indem man sie behandelt, wenn sie auftreten. Bitte schalten Sie für das nachfolgende Beispiel die Option "Bei Delphi-Exceptions stoppen" unter "Tools -> Debugger-Optionen -> Sprach-Exceptions" aus. Ansonsten würden Sie als Programmierer auch behandelte (und für den Endnutzer abgewendete) Exceptions sehen.

Code: Alles auswählen

var a, b: Integer;
    c : Double;
begin
  a := 5;
  b := 0;
  c := a / b;
  ShowMessage(FloatToStr(c));
end;
Wie kann ich nun in Lazarus:
"Bei Delphi-Exceptions stoppen" unter
Tools -> Debugger-Optionen -> Sprach-Exceptions.
(Siehe Quote oben)

Vielen Dank für schlauen Input!
Gruß!
idefix

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von MAC »

Herzlich willkommen hier im Lazarusforum.
(den spruch hab ich diese Woche schon oft gesagt , das ist gut ;D )

Auf die schnelle würde ich sagen, das es nicht so wichtig ist.
Eigentlich ist das standartmäßig aktiviert, das man selbst Fehlermeldungen bekommt um damit zu arbeiten, wenn das Programm ohne Debugger gestartet wird merkt man davon sowieso nichts mehr.

Ich schaue aber trotzdem mal nach.
Gefunden:
Werkzeuge --> Einstellungen --> Debugger --> Sprach Ausnahmen.
Hinzufügen kann man anscheinend nur wenn man den Genauen Namen, des Fehlers kennt. (was irgendwie dumm gemacht ist)
Allerdings fragt Lazarus bei einer "Debugger Fehlermeldung" ob man sie das nächste mal ausblenden will (das entspricht dem, was im Delphi Treff gewollt ist)
unter Sprach Ausnahmen kann man das brigens wieder rückgängig machen...

Code: Alles auswählen

Signatur := nil;

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von idefix »

Hallo!

Danke für die schnelle Antwort und die nette Begrüßung!

Ich hab Lazarus 0.9.30 installiert (unter WIN).
Gefunden habe ich die Einstellmöglichkeit unter:
Einstellungen, Einstellungen, Debugger, Sprachausnahmen

Ich habe als Fehlermeldung:
EXTERNAL:SIGFPE

Eingetragen habe ich:
SIGFPE
EXTERNAL:SIGFPE
EXTERNAL : SIGFPE

Ergebnis:
Ich bekomme unter Lazarus jedes Mal obige Fehlermeldung.
Der Debugger scheint sich aufgehängt zu haben. Ich komme da nur raus, indem ich das Lazarus beende! Das nervt.

Kannst Du mir den korrekten Eintrag bei "Sprachausnahmen" nennen? Oder wie ich da sonst rauskomme? Ohne Lazarus beenden zu müssen?

-------------------
Allerdings fragt Lazarus bei einer "Debugger Fehlermeldung" ob man sie das nächste mal ausblenden will (das entspricht dem, was im Delphi Treff gewollt ist)
Diese Abfrage taucht bei mir nicht auf. Wo kann ich das einstellen?

Vielen Dank!
Gruß!
idefix

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von MAC »

Also ich hab die aktuelle Entwicklungsversion: 0.9.31 31999 64bit win7 (google: Lazarus Snapshots)
Ich weis, das sich die Einstellungen in letzter Zeit ein paar mal geändert haben, deswegen kann das in der 0.9.30 noch anders sein...

Also bei der neuen 0.9.31 heißt der Befehl
"EInvalidOp" (ohne "") - du kannst ja mal versuchen diesen zu blocken.

Manchmal hängt sich der Debugger auch bei mir auf, was hilft ist:
--> Start --> Debugger zurücksetzen

Man kann in den Einstellunegn sogar eine ShortCut dafür anlegen...

Code: Alles auswählen

Signatur := nil;

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von idefix »

Hallo!

EInvalidOp funktioniert bei mir nicht.

@delphi treff
Ansonsten würden Sie als Programmierer auch behandelte (und für den Endnutzer abgewendete) Exceptions sehen.
Ich verstehe es so, dass ich zwar eine exception geschrieben habe. Der Nutzer der Exe nichts merkt. Ich aber bei jedem Durchlauf per Lazarus die Fehlermeldung bekomme. Lazarus steigt aus. Und ich kann nicht weiter programmieren.

Es ginge nur noch:

Code: Alles auswählen

procedure TForm1.Button2Click(Sender: TObject);
var
  a : real;
  zahl, b : Integer;
begin
  zahl := 0;
  b := 6;
  if zahl <> 0 then
    begin
      a := b / zahl;
      Label2.Caption := FloatToStr(a);
    end
  else
    Showmessage('teilen durch 0 nicht möglich')
end;
--------------------

--> Start --> Debugger zurücksetzen
klappt.

Danke!
Gruß!
idefix

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von MAC »

so wie du es verstanden hast ist es richtig.
Wieso Lazarus as nicht verkraftet ist mir allerdings nicht klar,
wobei das selerate nachfragen ob der eine Parameter nicht 0 ist natürlich noch besser ist als ein einfacher try except block...

Code: Alles auswählen

Signatur := nil;

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von idefix »

Hallo!

Ich habe zwei Rechner (in zwei Wohnungen).
Auf dem einen läuft Lazarus 0.9.30.unter WIN.
Auf diesem hier läuft Lazarus 0.9.30-2build1 unter Ubuntu.

Jetzt sitze ich halt vor dem Ubuntu Rechner und versuche mich mit
try
except

Ich habe eine if-Abfrage mit diversen OR geschrieben. Damit bei einer falschen Tastatureingabe, bei der eine Zahl erwartet wird, das Program den Fehler abfängt. Das kann man für jede Taste machen, kein Thema.

Nur, was wenn der User zwei 2 Ziffern und einen Buchstaben in ein Edit1. eingibt?
Das kann man dann wohl nur mit Try Except abfangen.

Anbei mein Code.
Ins Edit1.text wird eine 0 eingegeben.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  a,b : longint;
  c : real;
begin
  a := 50;
  b := StrToInt(Edit1.Text);
  try
    c := a / b;
    Label1.Caption:= FloatToStr(c);
  except
    exit;
  end;
end;
Mittels Haltepunkt und F8 Einzelschritt habe ich herausgefunden, das das Programm nach try in die Zeile
c := a / b; springt.

dann noch das Label1.caption
Die Zeile mit exit wird nicht angesprungen.
Aber auf der Form1 wird mittels des Label1.caption der Kürzel
+Inf
ausgegeben.

Frage, was muss ich in den Debugger Einstellungen ändern, damit sich Lazarus richtig verhält.
Und wo muss ich das einstellen?

Vielen Dank!
Gruß!
idefix

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von m.fuchs »

idefix hat geschrieben:
idefix hat geschrieben:Aber auf der Form1 wird mittels des Label1.caption der Kürzel
+Inf
ausgegeben.
Und das ist etwas seltsam. +Inf bedeutet Wertebereichsüberschreitung in Richtung + Unendlich, das scheint also das Ergebnis zu sein. Was aber mathematisch inkorrekt wäre, eigentlich müsste NaN (Not a Number) rauskommen.

Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von m.fuchs »

m.fuchs hat geschrieben:Und das ist etwas seltsam. +Inf bedeutet Wertebereichsüberschreitung in Richtung + Unendlich, das scheint also das Ergebnis zu sein. Was aber mathematisch inkorrekt wäre, eigentlich müsste NaN (Not a Number) rauskommen.
Nachtrag: Nach einem Hinweis auf der FPC-Mailingliste weiß ich nun, dass im IEEE 754 die Division durch Null definiert ist (http://de.wikipedia.org/wiki/Null#Divis ... _Computern). Das Ergebnis was du bekommst ist also völlig korrekt.

Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von idefix »

Hallo!

Was irritiert, ist, das mein Label1. die Fehlermeldung +Inf ausgibt.
Weiter, das die Try Except gar nicht angesprochen wird.
Ich kann dem User also nicht mitteilen, das er doch bitte was anderes als 0 eingeben soll.
Für den User ist +Inf doch ziemlich verwirrend.
Allerdings stürzt das Programm nicht ab.

-------------

Aber wenn ich

Code: Alles auswählen

b := StrToInt(Edit1.Text);
hinter Try einfüge, dann wird ein u abgefangen, und ich kann darauf nach except reagieren.
Hier z.B. einfach

Code: Alles auswählen

Label4.Caption:= Edit1.Text + ' ist keine Zahl';

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  a,b : longint;
  c : real;
begin
  a := 50;
  try
     b := StrToInt(Edit1.Text);
     c := a / b;
     Label1.Caption:= FloatToStr(c);
  except
    Label4.Caption:= Edit1.Text + ' ist keine Zahl'; 
    exit;
  end;
end;



Und das ist das was ich wollte.
Die if Abfrage ob b 0 ist, ist ja schnell gemacht.

Vielen Dank!

Gruß!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von m.fuchs »

idefix hat geschrieben:Was irritiert, ist, das mein Label1. die Fehlermeldung +Inf ausgibt.
Weiter, das die Try Except gar nicht angesprochen wird.
Das liegt daran, dass +Inf keine Fehlermeldung ist, sondern das Ergebnis. Und damit gibt es auch keine Exception.

Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von idefix »

Hallo!

Ich möchte in zwei Edit.text Zahlen eingeben.
Das klappt auch.
Was nicht klappt:
Wenn ich in Edit1 und Edit2 Buchstaben eingebe, so wird nur unter Label2.Caption der Text ausgegeben Edit1.Text + ' ist keine Zahl';

Code: Alles auswählen

Label2.Caption:= Edit1.Text + ' ist keine Zahl';
Die erste try ... except ...exit Sequenz wird abgearbeitet.
Aber die zweite nicht mehr.
Heißt das das das Programm bei exit die Procedure verläßt?

PS. das Edit1 mit Label2. zusammenhängt
und Edit2 mit Label3 ist richtig.

Code: Alles auswählen

procedure TForm1.add_versuchClick(Sender : TObject);
var
  a,b : integer;
  c : real;
begin
  b := 100000000;
  try
    a := StrToInt(Edit1.Text);
  except
    Label2.Caption:= Edit1.Text + ' ist keine Zahl';
    Label1.Caption:= '';
    exit;
  end;
  try
    b := StrToInt(Edit2.Text);
  except
    Label3.Caption:= Edit2.Text + ' ist keine Zahl';
    Label1.Caption := '';
    exit;
  end;
   c := a + b;
   Label1.Caption:= FloatToStr(c)
 end;
Daher habe ich etwas anderes versucht:
Hier habe ich zwei try except Sequenzen verschachtelt.
Indem Fall, das Edit1.text eine Zahl eingegeben wird, wird die zweite try except Sequenz nicht mehr angewsprungen.

Was kann ich da tun?

Code: Alles auswählen

procedure TForm1.addierenClick(Sender: TObject);
var
  a,b : integer;
  c : real;
begin
  b := 100000000; // nur zur Fehlersuche
  try
    a := StrToInt(Edit1.Text);
  except
    Label2.Caption:= Edit1.Text + ' ist keine Zahl';
    Label1.Caption:= '';
    try
      b := StrToInt(Edit2.Text);
    except
      Label3.Caption:= Edit2.Text + ' ist keine Zahl';
      Label1.Caption := '';
      exit;
    end;
  exit;
  end;
   c := a + b;
   Label1.Caption:= FloatToStr(c)
end;
Vielen Dank!
Gruß!
idefix

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von MAC »

1.
Die Dividison durch null ist Mathematisch nicht definiert.
In der Informatik ist sie allerdings definiert (warscheinlich je nachdem wie die CPU das intern bitweise rechnet oder so...)
Wurde ja auch schon geklärt...

2.
Jap, der Sinn on Exit ist ... Exit :)
Wenn in einer Procedure Exit steht wird die ganze Procedure gestoppt und übersprungen, nicht nur der try except block, heißt in deinem Fall: exit herausnehmen.
Soetwas ähnliches gibt es auch noch für Schleifen:
wenn in einer Schleife "Break;" steht, dann wird die gesammt Schleife abgebrochen.
Steht in einer Schleife "continue"; dann wird der aktuelle Durchgang beendet und die Schleife macht mit der nächsten Zahl weiter (z.B: bei for to do)

3.
Die Verschachtelung ist in diesem Fall nicht notwendig.
Du kannst die Try except blöcke einfach hintereinander schreiben...
Aktuell würde es ja folgendes machen:
Fall1:
Edit1 ist zahl:
a wird gesetzt;
b ist 1000000000000000000
c wird berechnet
Fall 2:
Edit1 ist keine Zahl:
a wird nicht gesetzt
b wird gesetzt
c wird nicht berechnet da Exit...
;

4.
Du kannst den ganzen Haufen auch vereinfachen:

Code: Alles auswählen

TryInttoStr(Edit1.Text,a);
TryInttoStr(Edit2.Text,b);
c := a+b;
 
//TryInttoStr fängt alle Fehler ab, und falls einer vorkommt wird glaub ich 0 zurückgegeben...

Code: Alles auswählen

Signatur := nil;

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von m.fuchs »

MAC hat geschrieben:Du kannst den ganzen Haufen auch vereinfachen:

Code: Alles auswählen

TryInttoStr(Edit1.Text,a);
TryInttoStr(Edit2.Text,b);
c := a+b;
//TryInttoStr fängt alle Fehler ab, und falls einer vorkommt wird glaub ich 0 zurückgegeben...
Einspruch euer Ehren.

1.) TryStrToInt heißt das Ding. Andersrum wäre es auch nicht sinnvoll.

2.) Der Witz an den Try... - Funktionen ist ja grad der Rückgabewert in Form eines Booleans. Also lieber so:

Code: Alles auswählen

if not (TryInttoStr(Edit1.Text,a)) then
  Label2.Caption:= Edit1.Text + ' ist keine Zahl';
if not (TryInttoStr(Edit2.Text,b)) then
  Label3.Caption:= Edit2.Text + ' ist keine Zahl';
Eine Möglichkeit zum Abbruch weiterer Operationen kann sich der geneigte Leser selbst ausdenken.

Michael
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Delphi zu Lazarus/ Tools>Debugger-Optionen>Sprach-Exceptions

Beitrag von idefix »

Hallo!

@m.fuchs

Hat super geklappt!

Danke auch an MAC!

Gruß!
idefix

Antworten