Bei Fehler mit nächster Zeile weitermachen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
michael070380
User
Beiträge: 29
Registriert: Freitag 16. Mai 2003, 09:05
Wohnort: Pfaffenhofen

Freitag 23. Dezember 2005, 16:09

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 23. Dezember 2005, 16:51

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
michael070380
User
Beiträge: 29
Registriert: Freitag 16. Mai 2003, 09:05
Wohnort: Pfaffenhofen

Freitag 23. Dezember 2005, 17:36

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.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Freitag 23. Dezember 2005, 19:10

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Sonntag 25. Dezember 2005, 23:43

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.
TUFKAB – the user formerly known as blackbird
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Montag 26. Dezember 2005, 00:16

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?
Benutzeravatar
SigMA
User
Beiträge: 181
Registriert: Sonntag 4. April 2004, 13:27
Wohnort: Freiburg
Kontaktdaten:

Montag 26. Dezember 2005, 19:16

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
Leichtdio.de - Das Kreativ-Blog
http://www.leichtdio.de
michael070380
User
Beiträge: 29
Registriert: Freitag 16. Mai 2003, 09:05
Wohnort: Pfaffenhofen

Mittwoch 4. Januar 2006, 17:22

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.
mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

Mittwoch 4. Januar 2006, 17:32

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..
Zuletzt geändert von mr.hide am Mittwoch 4. Januar 2006, 17:34, insgesamt 1-mal geändert.
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 4. Januar 2006, 17:33

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?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mr.hide
User
Beiträge: 108
Registriert: Montag 29. August 2005, 14:02

Mittwoch 4. Januar 2006, 17:40

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
Grüße
Matthias

- Fluchen befreit von Kummer und Leid -
Antworten