Seite 1 von 1
Try-Block in Try-Block?
Verfasst: Freitag 1. Mai 2009, 13:10
von Nocta
Hi.
Ich hab gerade mal so aus Spaß ein wenig über den Code geschaut:
https://develop.participatoryculture.or ... le/item.py
Da viel mir dann auf, dass da try-Blöcke in try-Blöcken geschrieben werden.
zB zeile 598 3 try-Blöcke.
Oder 652.
Ich bin jetzt nur zu confused um darin irgendwie einen Sinn zu erkennen. Warum lässt man den übergeordneten try-Block nicht einfach weg?
Verfasst: Freitag 1. Mai 2009, 13:18
von str1442
Normalerweise würde man sowas heute als try-except-finally Block schreiben. Früher konnte ein try nur ein except oder ein finally, aber nicht beide, enthalten. Deswegen musste man die Blöcke derart schachteln. try in einem except Block widerum ist doch nur logisch wenn man versuchen will, eine Ausnahmebehandlung zu nutzen, die selbst wieder schiefgehen könnte und dann Behandlung nötig hätte.
Verfasst: Freitag 1. Mai 2009, 13:19
von b.esser-wisser
Ich bin jetzt nur zu confused um darin irgendwie einen Sinn zu erkennen. Warum lässt man den übergeordneten try-Block nicht einfach weg?
Ich rate mal (hab gerad' keine Lust auf 700 Zeilen Code

):
- die try-blöcke sind nacheinander enstanden
- die try-Blöcke sind entstanden bevor
Code: Alles auswählen
try:
pass
except Exception, ex:
pass
except different_exxception, ex:
pass
else:
pass
finally:
pass
mit nur einem try-block erlaubt wurde (2.4?)
- so kann man verschiedene exceptions nacheinander behandeln (falls z.B. ein "except :" wieder eine Ausnahme auslöst)
hth, Jörg
Verfasst: Freitag 1. Mai 2009, 13:35
von Nocta
Code: Alles auswählen
597 try:
598 try:
599 self.releaseDateObj = datetime(*self.entry.enclosures[0].modified_parsed[0:7])
600 except:
601 try:
602 self.releaseDateObj = datetime(*self.entry.modified_parsed[0:7])
603 except:
604 self.releaseDateObj = datetime.min
605 finally:
606 self.endRead()
Mal als Beispiel aus dem Code zitiert.
Ich versteh da jetzt nur nicht den Sinn von dem äußerem Try-Block.
Kann man den nicht einfach weglassen?
Verfasst: Freitag 1. Mai 2009, 13:53
von birkenfeld
Nocta hat geschrieben:Code: Alles auswählen
597 try:
598 try:
599 self.releaseDateObj = datetime(*self.entry.enclosures[0].modified_parsed[0:7])
600 except:
601 try:
602 self.releaseDateObj = datetime(*self.entry.modified_parsed[0:7])
603 except:
604 self.releaseDateObj = datetime.min
605 finally:
606 self.endRead()
Mal als Beispiel aus dem Code zitiert.
Ich versteh da jetzt nur nicht den Sinn von dem äußerem Try-Block.
Kann man den nicht einfach weglassen?
Jain. Momentan, ja (außer "datetime.min" ist ein AttributeError), aber wenn im letzten except-Block mal mehr stehen sollte machts durchaus einen Unterschied.
Verfasst: Freitag 1. Mai 2009, 14:06
von Nocta
Ah Okay, jetzt verstehe ich den Sinn.
Quasi das selbe, wie wenn man den try-Block ins letzte except packen würde?
Naja in dem Fall dann wahrscheinlich unnötig aber safety first!

[/code]
Verfasst: Freitag 1. Mai 2009, 14:32
von birkenfeld
Nocta hat geschrieben:Ah Okay, jetzt verstehe ich den Sinn.
Quasi das selbe, wie wenn man den try-Block ins letzte except packen würde?
Nein, denn dann würde das "finally" ja nicht ausgeführt, wenn gar keine Exception aufträte.
Verfasst: Freitag 1. Mai 2009, 14:48
von Nocta
Wieso? oO
Das kann doch da bleiben wie's ist oder nicht?
Verfasst: Freitag 1. Mai 2009, 15:10
von birkenfeld
Hab ich deinen letzten Post falsch verstanden?
Verfasst: Freitag 1. Mai 2009, 15:46
von Nocta
Weiß ich nicht.
Ich meinte sowas:
wird zu
Wird dann finally nicht auch ausgeführt?
Aber wahrscheinlich sollte ich erstmal den Kater loswerden und dann anfangen über Python nachzudenken.
Verfasst: Freitag 1. Mai 2009, 15:47
von birkenfeld
Das finally kannst du aber in diesem Fall nicht weglassen:
Verfasst: Freitag 1. Mai 2009, 17:27
von Nocta
Das versteh ich jetzt nicht ganz. Warum sollte man es denn weglassen?
Verfasst: Freitag 1. Mai 2009, 17:30
von birkenfeld
Ich denke du musst mir jetzt doch mal erklären, was du mit
Quasi das selbe, wie wenn man den try-Block ins letzte except packen würde?
gemeint hast.
Verfasst: Freitag 1. Mai 2009, 17:51
von Nocta
Ich meinte damit das, was ich mit den beiden Pseudocodebeispielen gezeigt habe.
Dass man das äußere try wegmacht und dies dafür im letzten except schreibt.
Irgendwie scheinen wir aneinander vorbeizureden bzw ich bin zu dumm um das richtig zu verstehen

Verfasst: Freitag 1. Mai 2009, 17:58
von birkenfeld
Ah! Sorry. Aber try-except-finally gibt es halt erst seit Python 2.5.
Verfasst: Freitag 1. Mai 2009, 19:10
von Nocta
Ich hab das ganze jetzt übrigens auch verstanden ..
Stand ja eigentlich schon im ersten Post.
Ich war/bin eben manchmal schwer von Begriff

Danke dass ihr mir das erklärt habt
