2011-01-29 7 views
10

In Python l'istruzione try supporta una clausola else, che viene eseguita se il codice nel blocco try non genera un'eccezione. Ad esempio:Perché è necessaria la clausola else per l'istruzione try in python?

try: 
    f = open('foo', 'r') 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 
else: 
    data = f.read() 
    f.close() 

Perché è necessaria la clausola else? Non possiamo scrivere il codice precedente come segue:

try: 
    f = open('foo', 'r') 
    data = f.read() 
    f.close() 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 

Will not l'esecuzione procedere alla data = f.read() se aperto non solleva un'eccezione?

risposta

14

La differenza è cosa succede se si riceve un errore nel codice f.read() o f.close(). In questo caso:

try: 
    f = open('foo', 'r') 
    data = f.read() 
    f.close() 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 

Un errore nel f.read() o f.close() in questo caso darebbe il messaggio di log "Unable to open foo", che è chiaramente sbagliata.

In questo caso, si tratta di evitare:

try: 
    f = open('foo', 'r') 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 
else: 
    data = f.read() 
    f.close() 

E errore di lettura o di chiusura non causerebbe una scrittura di registro, ma l'errore sarebbe salire verso l'alto uncatched nello stack di chiamate.

+1

Grazie Lennart. E 'stato molto chiaro! :). Quindi, perché non vediamo la clausola else per provare in altri linguaggi come dire Java? :) – John

+10

@ John: Perché non sono buoni come Python? :-) –

2

Dalla mia comprensione, la clausola else è lì per limitare l'ambito del blocco try al codice a cui si sta tentando di gestire le eccezioni. In alternativa, i blocchi try sono più grandi e si possono rilevare eccezioni che non si intende catturare.

3

else viene utilizzato per il codice che deve essere eseguito se la clausola try non fa raise un'eccezione.

L'uso else è meglio di un ulteriore try clausola perché else evita la cattura accidentale un'eccezione che non è stata sollevata dal codice protetto dalla dichiarazione try except.

0

@John:
Penso che in linguaggi come Java o altri, si abbiano eccezioni diverse. Ad esempio qualcosa come FileNotFound Exception (o qualcosa del genere, non sono sicuro del nome).
In questo modo è possibile gestire diverse eccezioni e agire di conseguenza. Quindi sai perché si è verificato l'errore, a causa di apertura o chiusura.

Problemi correlati