Seite 1 von 1

Bei Fehler mit nächster Zeile weitermachen?

Verfasst: Freitag 23. Dezember 2005, 16:09
von michael070380
Hallo,
ist es in Python möglich, dass bei einer Fehlerzeile das Programm nicht abbricht sonder einfach mit der nächsten Zeile weitermacht?
Ich meine damit jetzt nicht einen try/except, denn dann müsste ich ja um jede Codezeile einen eigenen Block bauen.
In PHP ist es ja so, dass er bei einem Fehler einfach weitermacht und nicht das ganze Programm abbricht.
Gruß
Michael

Verfasst: Freitag 23. Dezember 2005, 16:51
von Leonidas
Dein Vorgehen erinnert eher an VBs On Error Resume Next um genau zu sein. Nein, dies ist in Python afaik nicht möglich und es ist auch gut so. Ausnahmen werden geworfen um auf diese zu reagieren, nicht um sie zu ignorieren, denn wenn irgendwo ein unbehandelter Fehler ist, dann man davon ausgehen, dass sich bald eine Fehlerkaskade anhäuft.

Warum willst du überhaupt so etwas machen? Das kann man doch sicherlich auch sauberer lösen.

Verfasst: Freitag 23. Dezember 2005, 17:36
von michael070380
Leonidas hat geschrieben:Dein Vorgehen erinnert eher an VBs On Error Resume Next um genau zu sein. Nein, dies ist in Python afaik nicht möglich und es ist auch gut so. Ausnahmen werden geworfen um auf diese zu reagieren, nicht um sie zu ignorieren, denn wenn irgendwo ein unbehandelter Fehler ist, dann man davon ausgehen, dass sich bald eine Fehlerkaskade anhäuft.

Warum willst du überhaupt so etwas machen? Das kann man doch sicherlich auch sauberer lösen.
Naja, es ist halt dann blöd wenn im Programm schon vorher einiges passiert ist, denn dann muss man wieder alles auf Anfangs-Situation stellen und nochmal komplett durchlaufen lassen, anstatt z.B. einfach ein kaputtes Feld zu beheben.
Es kann zudem immer wieder passieren dass in einem Zweig, der z.B. nicht so oft benutzt wird ein Fehler auftaucht, oder ein versehentlich gelöschter Tab.
Von daher vermittelt mir ein Programm das auf jeden Fall versucht das Programm zu ende zu bringen einen stabileren Eindruck...
Es ist auch schade, dass Pyton nicht so eine umfassende vorherige Syntax und Logik-Prüfung hat wie Java.

Verfasst: Freitag 23. Dezember 2005, 19:10
von Mr_Snede
Ich gebe da Leonidas Recht, aber du kannst ja mal an einem Beispiel zeigen, was du genau meinst.
Vielleicht macht es ja tatsächlich Sinn, oder lässt sich durch einen ganz anderen Progammansatz lösen (was ich eher glaube).

So ganz nebenbei:
Wie machst du für den Benutzer kenntlich, dass da ein Feld/Zweig nicht korrekt bearbeitet wurde?

Bis zu einem Fehler angelegte Einstellungen kannst du doch zwischenspeichern, also eine Session zB mit Pickle speichern.

cu Sebastian

Verfasst: Sonntag 25. Dezember 2005, 23:43
von mitsuhiko
Vielleicht willst du ja sowas:

Code: Alles auswählen

>>> def runorfail(f):
...     def wrapped(*args, **kwargs):
...             try:
...                     return f(*args, **kwargs)
...             except:
...                     return None
...     return wrapped
...
>>> @runorfail
... def permanent_broken(name):
...     raise ValueError, "%r ist kein valider Wert." % name
...
>>> t = permanent_broken("Hallo Welt")
>>> t
>>> def permanent_broken(name):
...     raise ValueError, "%s ist kein valider Wert." % name
...
>>> t = permanent_broken("Hallo Welt")
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 2, in permanent_broken
ValueError: Hallo Welt ist kein valider Wert.
Der obere Abschnitt deklariert einen dekorator, der bei fehlerfall einfach None zurückgibt.

Verfasst: Montag 26. Dezember 2005, 00:16
von Joghurt
michael070380 hat geschrieben:Von daher vermittelt mir ein Programm das auf jeden Fall versucht das Programm zu ende zu bringen einen stabileren Eindruck...
Auch wenn dann 17 anstatt 15 als Endergebnis herauskommt?

Verfasst: Montag 26. Dezember 2005, 19:16
von SigMA
also ich finde es auch absoluten humbug sowas zu machen! Ich will ein Programm das funktioniert und nicht, was einfach nur den Eindruck macht, das es das tut!

Sonst würde ich ja Windoff und nicht LInux benutzten ;)

Du solltest lieber ordentlich coden anstatt einfahc durchlaufen zu lassen! UNd zu Not reichen die try/except vollkommen aus!

SigMA

Verfasst: Mittwoch 4. Januar 2006, 17:22
von michael070380
z.B. in einer Schnittstelle: da müssen verschiedene Felder in entsprechende Typen umgewandelt werden z.B. String zu Zahl, String zu String mit bestimmter Länge (20 Zeichen) usw.
Da währe mir es lieber das Programm gibt einen Fehler aus und macht mit der nächsten Zeile weiter, wie wenn es einfach mittendrin abbricht.
In der Datenbank erkennt man dann eh spätestens den Fehler wenn z.B. in Alter -1 oder in Strasse ein teil fehlt.
Und um jede Umwandlung einen try - except bauen ist auch ein wenig übertrieben.

Verfasst: Mittwoch 4. Januar 2006, 17:32
von mr.hide
das nennt sich dann aber nicht programmieren ... :lol:

Versuch doch die einzelnen Aufgaben in Funktionen zu packen die dann im Fall eines Fehlers einen Defaultwert zurückgeben.

Wenn dir das zu aufwendig ist, pack einfach mehrere Aufgaben in eine Funktion, fällt was aus, fehlt halt ein Block und es läuft aber weiter.

Oder sowas:

Code: Alles auswählen

for i in aufgabenarray:
    try:
        erg = i
    except:
        erg = defaultwert
In dem Array kann ja alles mögliche stehen. Funktionsaufrufe, Ausdrücke usw..

Verfasst: Mittwoch 4. Januar 2006, 17:33
von Leonidas
SigMA hat geschrieben:Sonst würde ich ja Windoff und nicht LInux benutzten ;)
Bitte keine Flamewars. Linux hat auch viele Sachen die nicht immer 100%ig funktionieren.
michael070380 hat geschrieben:In der Datenbank erkennt man dann eh spätestens den Fehler wenn z.B. in Alter -1 oder in Strasse ein teil fehlt.
Und wenn man nicht in die Datenbank schaut dann merkt man den Fehler nicht und rechnet später mit falschen Werten.

Warum also nicht den Fehler dort abfangen wo er passiert und ihn nicht vergraben, bis vielleicht jemand darüber stolpert?

Verfasst: Mittwoch 4. Januar 2006, 17:40
von mr.hide
Oder du startest Teilprogramme als Thread, ist performanter und wenn die Daten unabhängig von einander sind ist das auch kein großer Akt.

Allerdings wird das immer eine Software sein, die ich weder verkaufen noch kaufen würde.

Gerade einen ordentliches Exceptionhandling spricht doch für Qualität.


PS: die neuen python code tags sind einfach klasse