Divison durch 0
Moderator: Moderatoren
- Manfred
- Foren-Administrator
- Beiträge: 21192
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Divison durch 0
Hi,
ich habe gerade eine interessante Entdeckung gemacht, die zwar nicht weltbewegend ist, aber mich doch ein wenig verwundert hat. Ich hatte im Programm eine Stelle, an der eine Divison durch 0 auftritt. Das Interessante war, das ich es anfangs gar nicht bemerkt hatte, aber immer wieder verwundert war, warum an dieser Stelle ein "merkwürdiges" Verhalten auftrat. Nachdem ich durch Zufall die Stelle im VX Debugger laufen ließ, stellte ich dann fest, dass der Fehler registriert, also dass die Errorsys aufgerufen wurde, aber mit einem RETURN 0 zurückgeschickt und somit der weitere Ablauf der Methode abgebrochen wurde. Das Programm sprang wieder zum vorhergegangenen Programmabschnitt zurück und tat so, als wenn nichts gewesen wäre.
Ist das eigentlich korrekt so? Als ich mir den Quellcode der Errorsys ansah, war es klar, aber ich habe vorher nicht daran gedacht, das der Fehler "so" abgefangen wird.
ich habe gerade eine interessante Entdeckung gemacht, die zwar nicht weltbewegend ist, aber mich doch ein wenig verwundert hat. Ich hatte im Programm eine Stelle, an der eine Divison durch 0 auftritt. Das Interessante war, das ich es anfangs gar nicht bemerkt hatte, aber immer wieder verwundert war, warum an dieser Stelle ein "merkwürdiges" Verhalten auftrat. Nachdem ich durch Zufall die Stelle im VX Debugger laufen ließ, stellte ich dann fest, dass der Fehler registriert, also dass die Errorsys aufgerufen wurde, aber mit einem RETURN 0 zurückgeschickt und somit der weitere Ablauf der Methode abgebrochen wurde. Das Programm sprang wieder zum vorhergegangenen Programmabschnitt zurück und tat so, als wenn nichts gewesen wäre.
Ist das eigentlich korrekt so? Als ich mir den Quellcode der Errorsys ansah, war es klar, aber ich habe vorher nicht daran gedacht, das der Fehler "so" abgefangen wird.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16516
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Manfred,
ich meine mich dunkel zu erinnern, dass dies mal vor einiger Zeit Thema in den Newsgroups war!
Soweit ich mich erinnere, wurde der Fehler entsprechend unter Clipper abgefangen, so dass dieses Verhalten auch unter Xbase++ nachgebildet wurde.
Viele Grüße,
Martin
ich meine mich dunkel zu erinnern, dass dies mal vor einiger Zeit Thema in den Newsgroups war!
Soweit ich mich erinnere, wurde der Fehler entsprechend unter Clipper abgefangen, so dass dieses Verhalten auch unter Xbase++ nachgebildet wurde.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Manfred
- Foren-Administrator
- Beiträge: 21192
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Martin,
naja, das es abgefangen wird ist schön, aber das es dann einen Rücksprung gibt, der den Rest komplett ignoriert? In dem Falle ist es aufgefallen, weil Bildschirmanzeigen fehlten, aber was mache ich, wenn ich eine komplexere Rechnung habe, die dann irgendwie Müll auswirft?
naja, das es abgefangen wird ist schön, aber das es dann einen Rücksprung gibt, der den Rest komplett ignoriert? In dem Falle ist es aufgefallen, weil Bildschirmanzeigen fehlten, aber was mache ich, wenn ich eine komplexere Rechnung habe, die dann irgendwie Müll auswirft?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Martin Altmann
- Foren-Administrator
- Beiträge: 16516
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Manfred,
wie gesagt: das Verhalten war unter Clipper genauso und wurde auf vielfachen Wunsch somit auch unter Xbase++ nachgezogen (wenn mich meine grauen Zellen nicht im Stich lassen...)
Viele Grüße,
Martin
wie gesagt: das Verhalten war unter Clipper genauso und wurde auf vielfachen Wunsch somit auch unter Xbase++ nachgezogen (wenn mich meine grauen Zellen nicht im Stich lassen...)
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Manfred
- Foren-Administrator
- Beiträge: 21192
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Hi Martin,
ich habe jetzt mal das Return 0 gegen RETURN ausgetauscht. Dann springt die Errorsys richtig an und macht zumindest die Fehlermeldung, (ich habe etwas mit Transform gemacht) das der Parameter einen falschen Typ hat.
Mal sehen, was man da insgesamt ändern kann.
Also ich bin der Meinung eine Divison durch 0 sollte man nicht so einfach ignorieren. Vielleicht sollte man sich anschauen, wo sowas vorkommen kann und dann entsprechende Abfragen vorher einbauen. Aber eine Meldung sollte schon kommen.
ich habe jetzt mal das Return 0 gegen RETURN ausgetauscht. Dann springt die Errorsys richtig an und macht zumindest die Fehlermeldung, (ich habe etwas mit Transform gemacht) das der Parameter einen falschen Typ hat.
Mal sehen, was man da insgesamt ändern kann.
Also ich bin der Meinung eine Divison durch 0 sollte man nicht so einfach ignorieren. Vielleicht sollte man sich anschauen, wo sowas vorkommen kann und dann entsprechende Abfragen vorher einbauen. Aber eine Meldung sollte schon kommen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Manfred,
das richtige Verhalten wäre, dass eine Fehlermeldung erscheint :
'Division durch 0 wurde von Programmierer nicht abgefangen, Programm wird beendet.' Wäre dir das lieber ?
Schon zu Clipperzeiten wurde darüber diskutiert. Die einzige richtige Antwort darauf ist, dass es NIE vorkommen darf, dass ein Teiler 0 wird. Du must im Programm Plausis setzen, dass die Teiler immer mit gültigen Werten gefüllt werden !
Division durch 0 gibt nunmal unendlich und ist deshalb verboten, wie soll da eine allgemeine Fehlerbehandlungsroutine den Fehler beheben ?
das richtige Verhalten wäre, dass eine Fehlermeldung erscheint :
'Division durch 0 wurde von Programmierer nicht abgefangen, Programm wird beendet.' Wäre dir das lieber ?
Schon zu Clipperzeiten wurde darüber diskutiert. Die einzige richtige Antwort darauf ist, dass es NIE vorkommen darf, dass ein Teiler 0 wird. Du must im Programm Plausis setzen, dass die Teiler immer mit gültigen Werten gefüllt werden !
Division durch 0 gibt nunmal unendlich und ist deshalb verboten, wie soll da eine allgemeine Fehlerbehandlungsroutine den Fehler beheben ?
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21192
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Neeeeee Hubert,
ich glaube jetzt reden wir aneinander vorbei. Es gibt ja auch Testphasen, die vom Programmierer durchlaufen werden sollten. Dabei sollte sowas halt irgendwie auffallen.
Die Meldung, die Du vorschlägst, ist nicht gerade geeignet für den Benutzer....
Aber lange Rede kurzer Sinn, ich war überrascht, wie es abgefangen wird. Irgendwie habe ich mir aber auch keine nennenswerten Gedanken bisher darüber gemacht, aber Du kannst davon ausgehen, dass dieser Vorfall mich jetzt in die Richtung schiebt Sicherheitsabfragen einzubauen....
ich glaube jetzt reden wir aneinander vorbei. Es gibt ja auch Testphasen, die vom Programmierer durchlaufen werden sollten. Dabei sollte sowas halt irgendwie auffallen.
Die Meldung, die Du vorschlägst, ist nicht gerade geeignet für den Benutzer....
Aber lange Rede kurzer Sinn, ich war überrascht, wie es abgefangen wird. Irgendwie habe ich mir aber auch keine nennenswerten Gedanken bisher darüber gemacht, aber Du kannst davon ausgehen, dass dieser Vorfall mich jetzt in die Richtung schiebt Sicherheitsabfragen einzubauen....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Da liegt das Problem, da immer alles schiefgeht und auch noch dann wenn man es nicht braucht, ist die Wahrscheinlichkeit groß, dass du beim Testen nie einen Fehler erhälst, da du ja die Werte gültig eingibst.Manfred hat geschrieben: Es gibt ja auch Testphasen, die vom Programmierer durchlaufen werden sollten. Dabei sollte sowas halt irgendwie auffallen..
Und beim ersten Anwender (DAU möchte ich den jetzt nicht nennen) kommt es zu der Division durch 0 und es kommt zum Fehler ...
Die einzige Möglichkeit das richtig zu verhindern, ist im Programm immer die Vorabprüfung einzubauen wo auch immer so ein Problem auftreten kann.
Was aber eventuell deinem Wunsch entsprechen würde, wäre folgende Zeile in der Fehlerbehandlung:
statt
RETURN 0
einfach
#ifdef DEBUG
Fehermeldung ...
#else
RETURN 0 // oder was du willst
#endif
Nun würde der DEBUG Zustand (diesen blende ich übrigens ähnlich bei mir in der TITEL-Leiste ein) automatisch das Verhalten steuern.
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21192
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Das ist ne Idee, daran habe ich jetzt gar nicht gedacht. Es reicht mir da und dort ein ALtd() einzubauen.Was aber eventuell deinem Wunsch entsprechen würde, wäre folgende Zeile in der Fehlerbehandlung:
statt
RETURN 0
einfach
#ifdef DEBUG
Fehermeldung ...
#else
RETURN 0 // oder was du willst
#endif
Das habe ich jetzt nicht verstanden. Was blendest Du wie in der Titelleiste ein?Nun würde der DEBUG Zustand (diesen blende ich übrigens ähnlich bei mir in der TITEL-Leiste ein) automatisch das Verhalten steuern.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Manfred,
ich habe einige Male aus Versehen Programme mit DEBUG=ON ausgeliefert, bis ich folgendes gemacht habe:
seither ist es mir nichtmehr passiert
ich habe einige Male aus Versehen Programme mit DEBUG=ON ausgeliefert, bis ich folgendes gemacht habe:
Code: Alles auswählen
#ifdef DEBUG
oWin:title := cTitel+" *** DEBUG ***"
#else
oWin:title := cTitel
#endif
Gruß
Hubert
Hubert
- Manfred
- Foren-Administrator
- Beiträge: 21192
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Aaach so,brandelh hat geschrieben:Hallo Manfred,
ich habe einige Male aus Versehen Programme mit DEBUG=ON ausgeliefert, bis ich folgendes gemacht habe:
seither ist es mir nichtmehr passiertCode: Alles auswählen
#ifdef DEBUG oWin:title := cTitel+" *** DEBUG ***" #else oWin:title := cTitel #endif
siehst Du, an so etwas denke ich gar nicht. Es geht nichts über eine gute Community....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!