2016-03-18 12 views
19

Używam biblioteki innej firmy, która jest w porządku, ale nie obsługuje plików niesortowanych tak, jak bym chciał. Kiedy nadając jej nieistniejąca plik, zamiast podnoszenia stare dobreJak poprawnie utworzyć właściwość FileNotFoundError?

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

podnosi jakieś niejasne wiadomość:

OSError: Syntax error in file None (line 1) 

nie chcę obsłużyć brakujący plik, nie chcą aby przechwycić wyjątek, nie należy go podnosić, nie chcę go ani open, ani go tworzyć, jeśli nie istnieje.

Chcę tylko sprawdzić, czy istnieje (w przeciwnym wypadku wystarczy podnieść właściwość FileNotFoundError).

Próbowałem to:

#!/usr/bin/env python3 

import os 

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

jakie tylko wyjścia:

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

To jest lepsze niż „błąd składni w pliku None”, ale jak to jest możliwe, aby podnieść „prawdziwy” wyjątek Pythona z odpowiednim komunikatem, bez konieczności ponownego wdrożenia go?

Odpowiedz

33

przepustkę argumentów:

import errno 
import os 

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

FileNotFoundError jest podklasą OSError, który trwa kilka argumentów. Pierwszym z nich jest kod błędu z errno module (nie znaleziono pliku zawsze jest errno.ENOENT), drugi komunikat o błędzie (użyj os.strerror(), aby to uzyskać), i podaj nazwę pliku jako 3rd.

Ostateczna reprezentacja ciąg używany w traceback jest zbudowany z tych argumentów:

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

Perfect! Tak bardzo starałem się znaleźć właściwą drogę pisania tego. – zezollo

+0

@zezollo: zaktualizowałem odpowiedź; Znalazłem 'os.strerror()' teraz (ja * wiedziałem * było mapowanie od numeru błędu do smsa gdzieś). –