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?
risposta
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
Sembra che [l'eccezione corretta sia IOError] (https://docs.python.org/2/library/exceptions.html#exceptions.IOError). – Mansour
@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
Ho letto l'esempio, ignorando completamente il testo! – Mansour
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.
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.
Puoi fornire qualche altro contesto? Di solito, le risposte a una frase non sono sufficienti su SO. – sadmicrowave
Un link o un preventivo alla documentazione, sarebbe fantastico. ^^ Questo è molto più inclusivo +1 – sadmicrowave
Ho aggiunto la citazione. e ha evidenziato la parte "file non trovato" :-) –
Non puoi farlo. Perché non definire da solo l'eccezione? –
'try' then' except: pass' – Hackaholic
@Hackaholic Err ... no. Perché dovrebbe volerlo fare? –