Seite 1 von 1

Try

Verfasst: Donnerstag 4. Januar 2007, 20:06
von blan
hi,

bin sehr begeistert von python und wollte fragen wie es denn eigentlich mit dem try aussieht. hab grad ein kleines programm geschrieben und überall dort wo ein fehler auftrag ein

Code: Alles auswählen

try:
    code

except:
    pass
eingebaut - evtl. noch ein bestimmtes Error abgefangen. da ich noch nie mit try garbeitet habe wollt ich fragen ob das ein guter oder eher schlechter stil is zu programmieren.

mfg blan

Verfasst: Donnerstag 4. Januar 2007, 20:17
von EnTeQuAk
eingebaut - evtl. noch ein bestimmtes Error abgefangen. da ich noch nie mit try garbeitet habe wollt ich fragen ob das ein guter oder eher schlechter stil is zu programmieren.
Überall Fehler abzufangen ist selten gut. So kann man evtl., wenn man es etwas übertreibt später bestimmte Fehler nicht mehr finden.

mit '' try: except: '' fange ich persönlich eigentlich nur Fehler ab, wo ich sicher bin, das Sie auftreten können, aber nicht zu verhindern sind. z.B.:

- Das Öffnen einer Datei (Zugrifsrechte nicht gesetzt, Datei existiert nicht)
- Eine Benutzereingabe, die bei Falscheingabe 100%ig zu einem unschönen Programmabruch führen kann.

Das sind eigentlich so gößtenteils die einzigen, wo ich es benutze.

MfG EnTeQuAk

Verfasst: Donnerstag 4. Januar 2007, 20:36
von Leonidas
Programme mit try-except zu versehen ist eigentlich guter Stil. Dieser Stil hat sogar einen Namen, nämlich [wiki=Allgemeine Begriffe#E]EAFP[/wiki]. Im Wiki steht eigentlich schon alles nötige drüber drin.

Eins noch:
Du solltest nie einfach nur except nutzen - fange immer bestimmte Exceptions ab, und nicht generell alle. Es kann sein, dass durchaus verschiedene Fehler auftauchen, die aber durch dein try-except-Konstrukt alle gleich behandelt werden. Sowas sollte nicht passieren, weil es dann zu schwer diagnostizierbaren Problemen kommen kann.

PS: Ich nutze try-except durchaus öfter und ziemlich gerne. Würde ich nicht missen wollen.

Verfasst: Donnerstag 4. Januar 2007, 20:46
von Sr4l
Ich nutze folgendes bei Except:

Code: Alles auswählen

import traceback
import string
import sys

def dothis():
    try:
        return [1,""]
    except:
        return [0,string.join(traceback.format_exception(sys.exc_type,sys.exc_value,sys.exc_traceback))]
Der Gedanke wenn die Function dothis()[0] gleich 1 ist hat alles geklappt und ich brauche mir keine sorgen machen. Wenn es aber 0 ist dann sollte ich dothis()[1] (die error message) zusammen mit Datum und Uhrzeit in ein Errorlog schreiben. So mache ich das zumindestens, habe einbisschen suchen müssen um das zufindene deshalb Poste ich das mal.

Verfasst: Donnerstag 4. Januar 2007, 21:16
von keppla
Der Gedanke wenn die Function dothis()[0] gleich 1 ist hat alles geklappt und ich brauche mir keine sorgen machen. Wenn es aber 0 ist dann sollte ich dothis()[1] (die error message) zusammen mit Datum und Uhrzeit in ein Errorlog schreiben.
Dass du loggen möchtest, ist verständlich, aber warum machst du da so ein gemurkse über rückgabewerte?
Exceptions wurden doch extra dazu erfunden, dass du einen zweiten, vom return der Funktionen unabhängigen Kanal hast, um mit Fehlern umzugehen.

zZ müsste der loggende Teil etwa sowas machen:

Code: Alles auswählen

all_ok, message = dothis()
if not all_ok:
   log(message)
da halte ich es für eleganter, wenn der loggende Teil so arbeiten würde:

Code: Alles auswählen

try:
  dothis()
except:
  log(tracebackkrams)
weil man sich dann diesen rückgabekrams in der funktion dothis() sparen kann.

Verfasst: Donnerstag 4. Januar 2007, 21:59
von blan
ok, danke - dann werd ich mal try - exception benutzen. ja das reine "exception" scheint nicht ganz so schlau zu sein :)

mfg blan

Verfasst: Donnerstag 4. Januar 2007, 22:40
von BlackJack
Wichtig ist auch das man nur ``try``/``except`` an Stellen benutzen sollte wenn man auch wirklich etwas sinnvolles mit der Ausnahme anfangen kann. Wenn nicht dann sollte man es einfach weglassen.

Ich hoffe das ``pass`` im ersten Beitrag war nur ein Platzhalter für eine sinvolle Behandlung. Nichts zu tun kann in einigen Fällen okay sein, aber man sollte sich dann wirklich fragen, ob man die Ausnahme wirklich ignorieren sollte/will.

Verfasst: Donnerstag 4. Januar 2007, 22:52
von Sr4l
@keppla
zZ müsste der loggende Teil etwa sowas machen:

Code: Alles auswählen

all_ok, message = dothis()
if not all_ok:
   log(message)
tut es aber nicht ich rufe dothis() über import auf und wenn ein error passiert müssen noch ein paar andere sachen geamcht werden ersteinmal muss dafür gesorgt werden das dieser schritt nicht wieder gemacht wird bis ein admin sich die Fehlermeldung angeshcaut hat dann wird noch ne mail verschickt damit es schnells möglich jmd bermerkt und dann macht er mit anderne abriet schritten weiter die genau das selbe schmea haben und so läuft das tag und nacht ab ^^
immer so das ein absturz nur möglichst kleine betrifft so ist zumindest der plan aber natürlich gibt es immer viele Möglichkeiten.
Das schwierigere damals war auch das mit dem modul traceback hinzubekommen das ich eine normale Debug-ausgabe habe.

Verfasst: Donnerstag 4. Januar 2007, 22:59
von blan
BlackJack hat geschrieben:Wichtig ist auch das man nur ``try``/``except`` an Stellen benutzen sollte wenn man auch wirklich etwas sinnvolles mit der Ausnahme anfangen kann. Wenn nicht dann sollte man es einfach weglassen.

Ich hoffe das ``pass`` im ersten Beitrag war nur ein Platzhalter für eine sinvolle Behandlung. Nichts zu tun kann in einigen Fällen okay sein, aber man sollte sich dann wirklich fragen, ob man die Ausnahme wirklich ignorieren sollte/will.
also in dem fall ist es so, dass ich ich ein xml-string übers netzwerk gesendet bekomm und den in dem try parsen lasse, wenn der string fehlerhaft ist wird ein error aufgerufen und den fang ich damit ab und mach nichts, irgnorier also das packet.

mfg blan

Verfasst: Freitag 5. Januar 2007, 12:10
von keppla
tut es aber nicht ich rufe dothis() über import auf
was genau meinst du damit?
und wenn ein error passiert müssen noch ein paar andere sachen geamcht werden [...]
Das steht ja auch gar nicht in Frage. Es ging mir nur um die Übermittlung der Ausnahme, du schaffst dir da extra einen Weg über return, ohne dass das einen Mehrwert erzeugt, imho.

Verfasst: Freitag 5. Januar 2007, 12:30
von jens
Oder sowas:

Minimal Variante:

Code: Alles auswählen

try:
    d[gibtsnicht] = nichtda
except Exception, e:
    print "Fehler:", e
    
print "und weiter geht's..."
Traceback anzeigen und weiter machen:

Code: Alles auswählen

import sys, traceback

try:
    d[gibtsnicht] = nichtda
except Exception, e:
    print "-----[Traceback START]-----"
    print traceback.format_exc(sys.exc_info()[2]),
    print "-----[Traceback END]-----"

print "und weiter geht's..."
In wiefern das jetzt Sinn macht, weiß ich auch nicht :roll: