Try

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
blan
User
Beiträge: 23
Registriert: Donnerstag 4. Mai 2006, 17:30

Donnerstag 4. Januar 2007, 20:06

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Donnerstag 4. Januar 2007, 20:17

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

Donnerstag 4. Januar 2007, 20:36

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 4. Januar 2007, 20:46

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.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Donnerstag 4. Januar 2007, 21:16

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.
blan
User
Beiträge: 23
Registriert: Donnerstag 4. Mai 2006, 17:30

Donnerstag 4. Januar 2007, 21:59

ok, danke - dann werd ich mal try - exception benutzen. ja das reine "exception" scheint nicht ganz so schlau zu sein :)

mfg blan
BlackJack

Donnerstag 4. Januar 2007, 22:40

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.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Donnerstag 4. Januar 2007, 22:52

@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.
blan
User
Beiträge: 23
Registriert: Donnerstag 4. Mai 2006, 17:30

Donnerstag 4. Januar 2007, 22:59

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
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Freitag 5. Januar 2007, 12:10

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.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 5. Januar 2007, 12:30

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:

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten