[gelöst] Exceptionhandling bei try except

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
lmcool
Beiträge: 3
Registriert: So 15. Jan 2017, 14:25

[gelöst] Exceptionhandling bei try except

Beitrag von lmcool »

Hey,
wollte bei meinem Programm (einfacher Rechner mit 2 Editfeldern) so vorsorgen, dass falls der Benutzer strings in die Editfelder eingibt, das Programm keinen Error ausgibt.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:integer;
begin
  try
     begin
     a:=strtoint(edit1.text);
     b:=strtoint(edit2.text);
     if op='+' then c:= a+b else c:= a-b;
     label2.Caption:=inttostr(c);
     end;
  except
    on EConvertError do
    begin
         a:= 0;
         b:=0;
    end;
  end;
end;


Der Error, der mir ausgegeben wurde, hieß 'EConvertError', also dachte ich, dass ich das Problem so lösen kann, kriege aber immer noch den gleichen Error.
Zuletzt geändert von lmcool am Mo 16. Jan 2017, 14:48, insgesamt 1-mal geändert.

delphifreak
Beiträge: 23
Registriert: Di 10. Mär 2015, 19:08
OS, Lazarus, FPC: Mint 21.2 Lazrus 3 Win10/Win11 Delphi 11.x Alexandria

Re: Exceptionhandling bei try except

Beitrag von delphifreak »

Hallo,

wenn du das Programm aus der Lazarus IDE mit F9 ausführst, dann wird dir die Exception weiterhin angezeigt.
Wenn du deine Exe normal aus dem Windows Datei-Explorer aufrufst, dann siehst du die Exception nicht.

Übrigens, schöner wäre doch, das Problem schon vorher zu beseitigen.
Also Edit-Felder verwenden, die nur die Eingabe von Zahlen erlauben. Dein Beispiel verwendet strtoint. Du möchtest also nur Integer-Werte (Ganzahlen) verarbeiten.
In diesem Fall schau dir mal die Eigenschaft "NumbersOnly" von TEdit an :D

lmcool
Beiträge: 3
Registriert: So 15. Jan 2017, 14:25

Re: Exceptionhandling bei try except

Beitrag von lmcool »

Danke erstmal, habe gar nicht daran gedacht, dass Programm an sich mal laufen zu lassen. Ich habe aber leider nichts zur NumbersOnly Eigenschaft gefunden. Bin bei der Suche auf das fshcomp-package gestoßen, finde aber auch dessen Komponenten nicht nach der Installation :?

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Exceptionhandling bei try except

Beitrag von Mathias »

Ich habe aber leider nichts zur NumbersOnly Eigenschaft gefunden

Wen du im Object-Inspektor unter Eigenschaften deines Edits schaust, hat es ein NumberOnly, welches auf false steht. Dieses musst du auf true stellen.

. Bin bei der Suche auf das fshcomp-package gestoßen, finde aber auch dessen Komponenten nicht nach der Installation :?

Installieren musst du nichts, dies ist Standard.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Exceptionhandling bei try except

Beitrag von wp_xyz »

Außerdem ist es sehr gefährlich, eine Exception zu behandeln, und dem Programm dann einfach passende Werte unterzujubeln. Der User wird dann später von dem Fehler nichts mitkriegen und sich wundern, warum plötzlich alles falsch ist. Viel besser ist es, die Exception anzeigen zu lassen, so dass der Benutzer weiß, dass da etwas nicht stimmt. Du kannst höchstens die Fehlermeldung verständlicher umschreiben, musst aber hinterher die Exception wieder per raise erzeugen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:integer;
begin
  try
     begin
     a:=strtoint(edit1.text);
     b:=strtoint(edit2.text);
     if op='+' then c:= a+b else c:= a-b;
     label2.Caption:=inttostr(c);
     end;
  except
    on EConvertError do
      raise Exception.Create('Mann-o-Mann! Du sollst hier ne gültige Zahl eingeben!');
  end;
end;

Das beste ist aber bei EConvertError - wie delphifreak oben schon erwähnte -, es gar nicht so weit kommen zu lassen. Neben StrToInt gibt es auch eine Funktion TryStrToInt, diese führt die Umwandlung aus, und falls dies nicht gelingt, wird das Ergebnis false zurückgeliefert:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:integer;
begin
  if not TryStrToInt(edit1.Text, a) then begin
    ShowMessage('Keine gültige Zahl.');
    SetFocus(edit1);   // den Fokus auf das fehlerhafte Eingabefeld setzen
    exit;
  end;
  if not TryStrToInt(edit2.Text, b) then begin
    ShowMessage('Keine gültige Zahl.');
    SetFocus(edit2);   // den Fokus auf das fehlerhafte Eingabefeld setzen
    exit;
  end;
 
  if op='+' then c:= a+b else c:= a-b;
  label2.Caption:=inttostr(c);
end;

lmcool
Beiträge: 3
Registriert: So 15. Jan 2017, 14:25

Re: Exceptionhandling bei try except

Beitrag von lmcool »

Danke! Das mit dem trystrtoint ist definitiv gut zu wissen.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: [gelöst] Exceptionhandling bei try except

Beitrag von wp_xyz »

Als Anmerkung noch: TryStrToXXXX gibt es auch noch für alle anderen String-zu-Zahl-Konvertierungen: TryStrToFloat, TryStrToDate, TryStrToTime, TryStrToDateTime, TryStrToCurr.

Antworten