2012-01-23 11 views
17

Próbuję zaimplementować metodę, która zwraca błąd, gdy dany katalog nie istnieje.Zgłaszanie wyjątku wbudowanego z domyślnym komunikatem w pythonie

Zamiast używać raise OSError("Directory does not exist."), chcę jednak użyć komunikatu o błędzie builtint z OSError: OSError: [Errno 2] No such file or directory:. Wynika to z tego, że zgłaszam wyjątek na początku wywołania metody, a nie później (co wywołałoby tę samą wiadomość z pythona, bez konieczności użycia raise).

Jakieś wskazówki? (Innych niż ręcznie robi OSError("[Errno 2] No such file or directory: "))

+2

wywołać wyjątek i niech go propagować? – delnan

+0

Dlaczego nie chcesz samodzielnie podnieść wyjątku na początku wywołania metody, np. z 'raise OSError (...)'? Jest to całkowicie poprawny sposób powiadamiania rozmówcy o problemie. –

+0

Dokładnie to, co próbowałem zrobić ~ Właśnie szukałem sposobu na dostęp do wbudowanych komunikatów o błędach. – bow

Odpowiedz

22
import os 

try: 
    open('foo') 
except IOError as err: 
    print(err) 
    print(err.args) 
    print(err.filename)  

produkuje

[Errno 2] No such file or directory: 'foo' 
(2, 'No such file or directory') 
foo 

Tak, aby wygenerować OSError o podobnym przeznaczeniu wiadomości

raise OSError(2, 'No such file or directory', 'foo') 
+2

+1 nie wiedziałem! – juliomalegria

+3

Używanie nazw błędów z modułu 'errno' i' os.strerror' w celu przetłumaczenia ich na zlokalizowany ciąg komunikatu jest lepsze niż wartości zakodowane na stałe: 'OSError (errno.ENOENT, os.strerror (errno.ENOENT), nazwa_pliku) ' – user3426575

+0

Użyj ** e.errno, e.filename i e.strerror **, aby uzyskać informacje o wyjątku. Zauważ, że wygląda na to, że wszystkie są Brak (łącznie z errno), chyba że co najmniej dwa argumenty są określone do wyjątku, a nazwa pliku jest trzecim argumentem. –

-1
try: 
    # ... 
except OSError: 
    raise OSError("your answer") 
+0

Przepraszam za taki widok, wysyłam odpowiedź od Androida i nie mam normalnego edytowania kodu – pod2metra

9

Aby otrzymać komunikat o błędzie dotyczący podając kod błędu, możesz użyć os.strerror:

>>> os.strerror(2) 
'No such file or directory' 

Również możesz użyć modułu errno używać standardowych skrótów dla tych błędów:

>>> errno.ENOENT 
2 
>>> os.strerror(errno.ENOENT) 
'No such file or directory' 
+0

Wow, nie wiedziałem tego. Będzie to przydatne :). Dzięki! – bow

1

Myślę, że prawdziwym problemem jest to, że jesteś prawdopodobnie robi kilka kontroli z wyprzedzeniem zamiast tylko próbuję.

try: 
    [CODE] 
except Exception: 
    [HANDLING CODE] 

jest znacznie lepsza niż:

if [SPECIAL CASE]: 
    [HANDLING CODE] 
elif [special case]: 
    [SPECIAL CASE] 
[CODE] 
2

myślę, że "wyjątek" jest terminem języka Python za to, co nazywają "error". Więc używaj tego terminu, gdy szukasz więcej informacji.

Może się przydać przeczytanie Python Standard Library documentation, "6. Built-in Exceptions".

OSError to jeden z wbudowanych wyjątków. Jest on zdefiniowany w sekcji "Wbudowane wyjątki", która dodaje: "Atrybut errno to numeryczny kod błędu z errno, a atrybut strerror jest odpowiadającym ciągiem, który zostanie wydrukowany przez funkcję C perror(). Zobacz moduł errno. , który zawiera nazwy kodów błędów zdefiniowanych przez bazowy system operacyjny. "

Uruchomienie tego kodu:

raise OSError(42, "my exception string", "no_such_file.dat") 

daje mi ten wynik:

Traceback (most recent call last): 
    Line 1, in <module> 
    raise OSError(42, "my exception string", "no_such_file.dat") 
OSError: [Errno 42] my exception string: 'no_such_file.dat' 

Tak, myślę, że kod może zrobić coś takiego:

raise OSError(2, "No such file or directory", filename) 
Powiązane problemy