EDivByZero

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Vincman
Beiträge: 16
Registriert: So 5. Feb 2017, 12:35

EDivByZero

Beitrag von Vincman »

Hallo, :D

ich habe einen Taschenrechner programmiert, der mithilfe des fpExpressionParsers rechnet und möchte jetzt die Division durch Null abfangen.
Dafür habe ich mir folgendes gedacht:

(Das hier ist ein Teil des Except-Blocks:)

Code: Alles auswählen

on EDivByZero
    do
    begin
      with Application do
            begin
              BoxStyle := MB_ICONASTERISK + MB_ICONHAND;
              Reply := MessageBox('Division durch Null', 'Fehler', BoxStyle);
            end;
      Exit;
    end;

(Die Anweisung zum Rechnen steht im Try-Block.)

Es kommt die >>External: SIGFPE<<-Nachricht und nachdem ich "Ok" gedrückt habe, kommt das Assemblerfenster.
Danach habe ich "Einzelschritt über die Anweisung gedrückt" und es kam der nächste Laufzeitfehler, diesmal aber konnte ich ihn mit "Diesen Ausnahmetyp übergehen" und "Fortsetzen" übergehen. Dann sollte das Programm eigentlich weiterlaufen, weil ich ja EDivByZero im Try-Except-Block behandle, aber es erschien wieder das Assemblerfenster. Auch nachdem ich das Programm beendet und ein zweites Mal gestartet habe, hat es nicht funktioniert... :(

Was muss ich tun? :shock:

Danke im Vorraus
Vincman


PS: Oder kann man den Fehler gar nicht abfangen?

Vincman
Beiträge: 16
Registriert: So 5. Feb 2017, 12:35

Re: EDivByZero

Beitrag von Vincman »

... und ich benutze IDE v1.4.2 8)

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

Re: EDivByZero

Beitrag von wp_xyz »

Wenn dein Programm in der IDE, also im Debugger, läuft, sind die Exceptions schwer kontrollierbar, weil der Debugger dazwischen funkt, und es sieht so aus, als ob die Exceptions nicht erkannt werden. Wichtig ist, wenn das Programm außerhalb der IDE gestartet wird, dann werden die Exceptions eigentlich so abgefangen wie geplant.

Vincman
Beiträge: 16
Registriert: So 5. Feb 2017, 12:35

Re: EDivByZero

Beitrag von Vincman »

Okay, danke!

Und was empfiehlst du?

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

Re: EDivByZero

Beitrag von wp_xyz »

Nichts, Zähne zusammenbeißen...

Oder generell versuchen, diese Exceptions zu vermeiden. Auf https://sourceforge.net/p/wp-laz/code/H ... nk/source/ findest du eine überarbeitete Version des FPExpressionParsers, bei dem bei einem Fehler keine Exception ausgelöst wird, sondern als Funktionswert NaN übergeben wird. Natürlich ist das sehr pauschal, und du kannst keine der Fehlerursache angepasste Meldung anzeigen. Aber in diesem Programm, einem Funktionsplotter, ist das auch gar nicht sinnvoll, weil man sonst, auch ohne IDE, beim Zeichnen der Funktionskurve evtl alle Pixel die Fehlermeldung wegklicken muss - in meiner Lösung wird in diesem Fall einfach gar kein Funktionswert gezeichnet.

Antworten