2016-03-18 14 views
19

Io uso una libreria di terze parti che va bene ma non gestisce file inesistenti come vorrei. Quando dandogli un file inesistente, invece di sollevare il buon vecchioCome si genera un errore FileNotFoundError correttamente?

FileNotFoundError: [Errno 2] No such file or directory: 'nothing.txt' 

solleva qualche oscuro messaggio:

OSError: Syntax error in file None (line 1) 

Non voglio per gestire il file mancante, non vogliono per catturare o gestire l'eccezione, non voglio sollevare un'eccezione personalizzata, né voglio I a open il file, né a crearlo se non esiste.

Voglio solo verificarne l'esistenza (os.path.isfile(filename) farà il trucco) e in caso contrario, basta sollevare un FileNotFoundError corretto.

ho provato questo:

#!/usr/bin/env python3 

import os 

if not os.path.isfile("nothing.txt"): 
    raise FileNotFoundError 

ciò che solo uscite:

Traceback (most recent call last): 
    File "./test_script.py", line 6, in <module> 
    raise FileNotFoundError 
FileNotFoundError 

Questo è meglio di un "Errore di sintassi nel file di Nessuno", ma come è possibile aumentare la "vera" un'eccezione python con il messaggio corretto, senza doverla reimplementare?

risposta

33

Pass argomenti:

import errno 
import os 

raise FileNotFoundError(
    errno.ENOENT, os.strerror(errno.ENOENT), filename) 

FileNotFoundError è una sottoclasse di OSError, che richiede diversi argomenti. Il primo è un codice di errore da errno module (il file non trovato è sempre errno.ENOENT), il secondo il messaggio di errore (utilizzare os.strerror() per ottenere ciò) e passare il nome file come terzo.

La rappresentazione stringa finale usato in un traceback è costruito da questi argomenti:

>>> print(FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), 'foobar')) 
[Errno 2] No such file or directory: 'foobar' 
+0

Perfetto! Ero così difficile da trovare il modo giusto di scrivere questo. – zezollo

+0

@zezollo: ho aggiornato la risposta; Ho trovato 'os.strerror()' adesso (ho * saputo * c'era una mappatura dal numero di errore al messaggio di stringa da qualche parte). –

Problemi correlati