1) Venendo dal java, mi viene naturale ragionare in javese, e mi chiedo se ci sono differenze fra i 2 finally o sono assolutamente identici
Non conoscendo Java non saprei cosa dire.
2) Perchè su varie guide leggo che o si utilizzano i blocchi exception o il solo blocco finally, ma mai insieme, quando poi andando a provare, non ho (apparentemente) riscontrato problemi?
Infatti non è vero che non si può. Probabilmente ti stai confondendo.
Il concetto del finally è molto semplice: all'interno del blocco try/except quello che sta sotto finally viene eseguito sempre, sia che venga sollevata un'eccezione o meno.
Esempio, qui verrà stampato "eccezione" e "finally":
codice:
try:
raise
except:
print "eccezione"
finally:
print "finally"
Qui solo "finally".
codice:
try:
pass
except:
print "eccezione"
finally:
print "finally"
E qui di nuovo solo "finally".
codice:
try:
pass
except:
raise
finally:
print "finally"
La differenza col codice che hai postato:
codice:
try:
apro un file
bla bla bla
catch:
bla bla bla
chiudo il file // tanto qui ci arrivo sia se ci sono eccezioni sia che non ce ne sono
E' che se "bla bla" solleva eccezione "chiudo il file" non verrà mai eseguito (vedi "non ci arriverai mai").