Try-Block in Try-Block?

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.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Freitag 1. Mai 2009, 13:10

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?
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Freitag 1. Mai 2009, 13:18

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.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Freitag 1. Mai 2009, 13:19

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
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Freitag 1. Mai 2009, 13:35

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?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 1. Mai 2009, 13:53

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Freitag 1. Mai 2009, 14:06

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! :D[/code]
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 1. Mai 2009, 14:32

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Freitag 1. Mai 2009, 14:48

Wieso? oO
Das kann doch da bleiben wie's ist oder nicht?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 1. Mai 2009, 15:10

Hab ich deinen letzten Post falsch verstanden?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Freitag 1. Mai 2009, 15:46

Weiß ich nicht.
Ich meinte sowas:

Code: Alles auswählen

try:
    try:
    except:
        try:
        except:
finally:
wird zu

Code: Alles auswählen

try:
except:
    try:
    except:
        try:
        except: pass
finally:
Wird dann finally nicht auch ausgeführt?
Aber wahrscheinlich sollte ich erstmal den Kater loswerden und dann anfangen über Python nachzudenken.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 1. Mai 2009, 15:47

Das finally kannst du aber in diesem Fall nicht weglassen:

Code: Alles auswählen

try:
    try:
    except:
        try:
        except: raise
finally:
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Freitag 1. Mai 2009, 17:27

Das versteh ich jetzt nicht ganz. Warum sollte man es denn weglassen?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 1. Mai 2009, 17:30

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Freitag 1. Mai 2009, 17:51

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 :D
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Freitag 1. Mai 2009, 17:58

Ah! Sorry. Aber try-except-finally gibt es halt erst seit Python 2.5.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten