Kiedy chcesz po prostu spróbować wypróbować bez obsługi wyjątku, jak to zrobić w Pythonie?
Czy podążanie za tym jest właściwym sposobem?
try:
shutil.rmtree(path)
except:
pass
python
exception
try-except
Joan Venge
źródło
źródło
shutil.rmtree(path, ignore_errors=True)
. Nie dotyczy to jednak większości funkcji.Odpowiedzi:
lub
Różnica polega na tym, że pierwszy z nich będzie również złapać
KeyboardInterrupt
,SystemExit
i takie rzeczy, które pochodzą bezpośrednio zexceptions.BaseException
nieexceptions.Exception
.Szczegółowe informacje można znaleźć w dokumentacji:
try
komunikatźródło
try: shuti.rmtree(...) except: pass
z grubsza tłumi wszelkie błędy (nawet jeśli źleshutil
NameError
except OSError:
Najlepszą praktyką jest wychwytywanie tylko tych błędów, które Cię interesują. W przypadku
shutil.rmtree
prawdopodobnieOSError
:Jeśli chcesz po cichu zignorować ten błąd, wykonaj następujące czynności:
Dlaczego? Powiedzmy, że przypadkowo przekazujesz funkcję liczby całkowitej zamiast ciągu, na przykład:
Daje błąd „TypeError: zmuszanie do Unicode: potrzebujesz ciągu lub bufora, znaleziono int” - prawdopodobnie nie chcesz tego ignorować, co może być trudne do debugowania.
Jeśli zdecydowanie chcesz zignorować wszystkie błędy, złap
Exception
raczej niż zwykłeexcept:
oświadczenie. Znowu dlaczego?Brak określenia wyjątku przechwytuje każdy wyjątek, w tym
SystemExit
wyjątek, który na przykładsys.exit()
wykorzystuje:Porównaj to z następującymi, które poprawnie wychodzą:
Jeśli chcesz pisać coraz lepiej zachowujący się kod,
OSError
wyjątek może reprezentować różne błędy, ale w powyższym przykładzie chcemy tylko zignorowaćErrno 2
, abyśmy mogli być jeszcze bardziej szczegółowi:źródło
shutil.rmtree
nie jest najlepszym przykładem, ponieważ po prostuignore_errors=True
To zależy od tego, co rozumiesz przez „obsługę”.
Jeśli chcesz go złapać bez podejmowania jakichkolwiek działań, opublikowany kod będzie działał.
Jeśli masz na myśli, że chcesz podjąć działanie w stosunku do wyjątku bez zatrzymywania wyjątku przed wejściem na wyższy stos, to potrzebujesz czegoś takiego:
źródło
Najpierw zacytowałem odpowiedź Jacka O'Connora z tego wątku . Odwołany wątek został zamknięty, więc piszę tutaj:
„Jest nowy sposób na zrobienie tego w Pythonie 3.4:
Oto zatwierdzenie, które go dodało: http://hg.python.org/cpython/rev/406b47c64480
A oto autor, Raymond Hettinger, mówiąc o tym i wielu innych upodobaniach Pythona: https://youtu.be/OSGv2VnC0go?t=43m23s
Mój dodatek do tego to odpowiednik Python 2.7:
Następnie używasz go jak w Pythonie 3.4:
źródło
Dla pełności:
Pamiętaj również, że możesz przechwycić wyjątek w następujący sposób:
... i ponownie podnieś wyjątek w ten sposób:
... przykłady z samouczka języka python .
źródło
Można to zrobić na kilka sposobów.
Jednak wybór przykładu ma proste rozwiązanie, które nie obejmuje ogólnego przypadku.
Specyficzny dla przykładu:
Zamiast
Zrób to:
Jest to argument specyficzny dla
shutil.rmtree
. Możesz zobaczyć pomoc na ten temat, wykonując następujące czynności, a zobaczysz, że może ona również umożliwiać działanie w przypadku błędów.Ponieważ dotyczy to tylko wąskiego przypadku przykładu, pokażę dalej, jak sobie z tym poradzić, jeśli te argumenty słów kluczowych nie istnieją.
Ogólne podejście
Ponieważ powyższe dotyczy tylko wąskiego przypadku przykładu, pokażę dalej, jak sobie z tym poradzić, jeśli te argumenty słów kluczowych nie istnieją.
Nowości w Python 3.4:
Możesz zaimportować
suppress
menedżera kontekstu:Ale tylko pomiń najbardziej specyficzny wyjątek:
Po cichu zignorujesz
FileNotFoundError
:Z dokumentów :
Zauważ, że
suppress
iFileNotFoundError
są dostępne tylko w Pythonie 3.Jeśli chcesz, aby Twój kod działał również w Pythonie 2, zobacz następną sekcję:
Python 2 i 3:
W przypadku kodu zgodnego z Python 2
pass
jest to poprawny sposób, aby uzyskać instrukcję, której nie można pominąć. Ale kiedy robisz gołeexcept:
, że to samo, co robiexcept BaseException:
, które zawieraGeneratorExit
,KeyboardInterrupt
iSystemExit
, w ogóle, nie chcesz, aby złapać te rzeczy.W rzeczywistości powinieneś nazwać wyjątek tak dokładnie, jak możesz.
Oto część hierarchii wyjątków języka Python (2) i, jak widać, jeśli złapiesz bardziej ogólne wyjątki, możesz ukryć nieoczekiwane problemy:
Prawdopodobnie chcesz złapać tutaj błąd OSErrr, a być może wyjątkiem, na którym ci nie zależy, jest brak katalogu.
Możemy uzyskać ten konkretny numer błędu z
errno
biblioteki i poprawić go, jeśli go nie mamy:Uwaga: nagie przebicie podnosi pierwotny wyjątek, który prawdopodobnie jest tym, czego chcesz w tym przypadku. Napisane bardziej zwięźle, ponieważ tak naprawdę nie musimy jawnie używać
pass
kodu w obsłudze wyjątków:źródło
Pomoże to wydrukować wyjątek :( tj. Spróbuj złapać bez obsługi wyjątku i wydrukować wyjątek).
źródło
Do Twojej wiadomości klauzula else może przejść po wszystkich wyjątkach i zostanie uruchomiona tylko wtedy, gdy kod w try nie spowoduje wyjątku.
źródło
else
w tym kontekście. I dodać, że zawszefinally
będzie działać po jakimkolwiek (lub bez wyjątku).Musiałem zignorować błędy w wielu poleceniach i kurwa to załatwiło
źródło
W Pythonie obsługujemy wyjątki podobne do innych języków, ale różnica polega na pewnej różnicy składni, na przykład:
źródło
Zwykle po prostu robię:
źródło
_ = ""
zpass
.