2014-11-04 13 views
12

Obecnie używam Pythona 2 w projekcie wymagającym wbudowanego wyjątku Python 3: FileNotFoundError. Jak mam to zrobić?Jak importować FileNotFoundError z Python 3?

+0

Nie możesz tego zrobić. Dlaczego samemu nie zdefiniować wyjątku? –

+0

'try' then' except: pass' – Hackaholic

+7

@Hackholicic Err ... no. Dlaczego miałby to robić? –

Odpowiedz

20

Można oczywiście zdefiniować dowolne wyjątki.

Ale oni ci nic nie pomogą. Cały punkt FileNotFoundError jest taki, że każda operacja w języku Python, która uruchamia się w błędzie nie znaleziono pliku, spowoduje zgłoszenie wyjątku. Samo zdefiniowanie własnego wyjątku nie sprawi, że to prawda. Wszystko, co dostaniesz, to OSError (lub IOError, w zależności od wersji 2.x) z odpowiednią wartością errno. Jeśli spróbujesz obsłużyć niestandardowy FileNotFoundError, twój program obsługi nigdy nie zostanie wywołany.

Więc, co naprawdę chcesz to (na przykład):

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

Wygląda na to, że [poprawny wyjątek to IOError] (https://docs.python.org/2/library/exceptions.html#exceptions.IOError). – Mansour

+2

@Mansour: dla 2,6-2,7, dwa są dość czysto podzielone. W starszych wersjach (szczególnie jeśli nie używasz CPython), jest to inna historia (a niektóre rzeczy, takie jak błędy połączenia z gniazdem, to _neither_). Stąd "w zależności od wersji 2.x". Aby być bezpiecznym, zawsze możesz złapać oba, lub (chyba że musisz wrócić do wersji 1.5) ich wspólną podklasę EnvironmentError. – abarnert

+0

Przeczytałem przykład, całkowicie ignorując tekst! – Mansour

2

Można po prostu utworzyć wyjątek FileNotFoundError siebie:

class FileNotFoundError(OSError): 
    pass 

Ta nowa klasa wyjątków dziedziczy OSError podobnie jak jeden w Pythonie 3.x.

Tutaj jest odniesienie na User-defined Exceptions w Pythonie.

2

Można użyć IOError zamiast:

Wywoływany w przypadku operacji I/O (takie jak oświadczenie drukującym, wbudowana funkcja open() lub metoda obiektu pliku) nie powiodła się z powodu powodującego wejście/wyjście, np. "file not found" lub "full dysku".

Ta klasa wywodzi się z EnvironmentError. Zobacz powyższą dyskusję, aby uzyskać więcej informacji na temat atrybutów wystąpień wyjątków.

Zmieniono w wersji 2.6: Zmieniono socket.error, aby użyć go jako klasy bazowej.

+0

Czy możesz podać trochę więcej kontekstu? Zazwyczaj odpowiedzi w jednym zdaniu nie są wystarczające w przypadku SO. – sadmicrowave

+0

Link lub cytat do dokumentacji byłby świetny. ^^ To znacznie bardziej inkluzywne +1 – sadmicrowave

+1

Dodałem ofertę. i podświetloną część "nie znaleziono pliku" :-) –