2014-11-04 16 views
12

Attualmente sto usando Python 2 su un progetto che ha bisogno di un'eccezione built-in Python 3: FileNotFoundError. Come lo faccio?Come posso importare FileNotFoundError da Python 3?

+0

Non puoi farlo. Perché non definire da solo l'eccezione? –

+0

'try' then' except: pass' – Hackaholic

+7

@Hackaholic Err ... no. Perché dovrebbe volerlo fare? –

risposta

20

Naturalmente è possibile definire le eccezioni desiderate.

Ma non ti faranno del bene. L'intero punto di FileNotFoundError è che qualsiasi operazione Python eseguita in un errore file-not-found genererà quell'eccezione. La semplice definizione della tua eccezione non lo renderà vero. Tutto quello che otterrete è un OSError (o IOError, a seconda della versione 2.x) con un valore appropriato errno. Se si tenta di gestire un numero personalizzato FileNotFoundError, il gestore non verrà mai chiamato.

Allora, che cosa si vuole veramente è (per esempio):

try: 
    f = open(path) 
except OSError as e: 
    if e.errno == errno.ENOENT: 
     # do your FileNotFoundError code here 
    else: 
     raise 
+2

Sembra che [l'eccezione corretta sia IOError] (https://docs.python.org/2/library/exceptions.html#exceptions.IOError). – Mansour

+2

@Mansour: per 2.6-2.7, i due sono divisi in modo abbastanza netto. Per le versioni precedenti (specialmente se non stai usando CPython), è una storia diversa (e alcune cose, come gli errori di connessione socket, erano _neither_). Quindi "dipende dalla versione 2.x". Per sicurezza, puoi sempre prendere entrambi, o (a meno che non sia necessario tornare indietro alla 1.5) la loro sottoclasse comune EnvironmentError. – abarnert

+0

Ho letto l'esempio, ignorando completamente il testo! – Mansour

2

Si può semplicemente creare l'eccezione FileNotFoundError da soli:

class FileNotFoundError(OSError): 
    pass 

Questa nuova classe di eccezione eredita da OSError proprio come quella in Python 3.x.

Ecco un riferimento su User-defined Exceptions in Python.

2

Si potrebbe utilizzare IOError invece:

sollevata quando un'operazione di I/O (ad esempio una dichiarazione di stampa, il funzione open() integrata o un metodo di un oggetto file) non riesce per un motivo relativo all'I/O, ad es. "file non trovato" o "disco pieno".

Questa classe deriva da EnvironmentError. Vedi la discussione sopra per maggiori informazioni sugli attributi delle istanze di eccezione.

Modificato nella versione 2.6: cambiato socket.error per utilizzarlo come classe base.

+0

Puoi fornire qualche altro contesto? Di solito, le risposte a una frase non sono sufficienti su SO. – sadmicrowave

+0

Un link o un preventivo alla documentazione, sarebbe fantastico. ^^ Questo è molto più inclusivo +1 – sadmicrowave

+1

Ho aggiunto la citazione. e ha evidenziato la parte "file non trovato" :-) –

Problemi correlati