Python: Jak zignorować wyjątek i kontynuować?


239

Mam próba ... z wyjątkiem bloku w moim kodzie i Kiedy wyjątek jest rzut. Naprawdę chcę tylko kontynuować kod, ponieważ w takim przypadku wszystko jest nadal w porządku. Problem polega na tym, że jeśli wyjdziesz poza blok: pusty lub z nicią #do, pojawi się błąd składni. Nie mogę kontynuować, ponieważ nie jest w pętli. Czy istnieje słowo kluczowe, które może posłużyć do napisania kodu?

359
except: 
    pass 
+64

oprócz Wyjątek: należy podać # ważne, aby nie połknąć innych wyjątków! 22 lut. 092009-02-22 16:46:45

+8

@Aaron - Zgadzam się, ale pytanie nie było, czy to był dobry/zły pomysł. 23 lut. 092009-02-23 20:05:24

+15

To złapie SystemExit, KeyboardInterrupt i inne rzeczy, które prawdopodobnie nie chcesz złapać. 02 sty. 102010-01-02 01:13:31

+1

Nie spowoduje to przerwania klawiatury. Na przykład: 'podczas Prawda:' ' spróbować: ' f = open ('filedoesnotexist.txt') '' wyjątkiem: '' pass' KeyboardInterrupt zatrzymuje się i wychodzi z kodu. 24 lip. 122012-07-24 15:59:51

+14

@ChthonicProject a bare 'except' będzie przechwytywał każdy wyjątek, w tym KeyboardInterrupt, ale tylko wtedy, gdy dzieje się to w' try'. W twoim przykładzie, KeyboardInterrupt może wystąpić przed 'try' lub wewnątrz' except', gdzie nie zostanie przechwycony. Jeśli użyjesz przykładu '' while True: '' try: pass' 'except: pass', przekonasz się, że KeyboardInterrupt zostaje złapany tylko w 50% przypadków. Jeśli 'time.sleep (1)' wewnątrz 'try', okaże się, że zostanie złapany prawie za każdym razem. 22 mar. 132013-03-22 08:39:50


12

Spróbuj tego:

try: 
    blah() 
except: 
    pass 

202

Standard "nop" w Pythonie jest oświadczenie pass:

try: 
    do_something() 
except Exception: 
    pass 

powodu ostatniej rzucony wyjątek jest zapamiętany w Pythonie, niektóre z obiekty zaangażowane w instrukcję wyrzucania wyjątków są przechowywane na żywo przez czas nieokreślony (w rzeczywistości do następnego wyjątku). W przypadku, gdy jest to ważne dla ciebie i (zazwyczaj) nie trzeba pamiętać ostatnią rzucony wyjątek, można wykonać następujące czynności zamiast pass:

try: 
    do_something() 
except Exception: 
    sys.exc_clear() 

ta kasuje ostatnią rzucony wyjątek.

+26

To jest lepsza odpowiedź niż ta, która została przyjęta, ponieważ używa "z wyjątkiem wyjątku:" zamiast tylko "z wyjątkiem:" które, jak wskazali inni, będzie niewłaściwie połknąć inne rzeczy, których nie chcesz łapać jak SystemExit i KeyboardInterrupt . 11 lip. 112011-07-11 21:50:28

+4

+1 Usuwa również błąd, który jest ważny podczas uruchamiania zmian i oczekuje wyjątków. 26 paź. 112011-10-26 13:50:55

  0

Należy zauważyć, że "exc_clear" został usunięty w pythonie 3. https: // docs.python.org/3/whatsnew/3.0.html#index-22. Kilka sposobów rozwiązania tego problemu w Pythonie 3 można znaleźć tutaj: https://cosmicpercolator.com/2016/01/13/exception-leaks-in-python-2-and-3/ 06 mar. 182018-03-06 18:59:18


114

Pojawił się nowy sposób, aby to zrobić w najbliższych Pythonie 3.4:

from contextlib import suppress 

with suppress(Exception): 
    # your code 

Oto popełnić że dodaje go: http://hg.python.org/cpython/rev/406b47c64480

A oto autor Raymond Hettinger, rozmowy na ten temat i wszystkie rodzaje inna gorliwość w Pythonie (odpowiednia liczba o 43:30): http://www.youtube.com/watch?v=OSGv2VnC0go

Jeśli chcesz emulować puste słowo kluczowe except, a także ignorować takie rzeczy, jak KeyboardInterrupt - chociaż zazwyczaj tego nie robisz - możesz użyj with suppress(BaseException).

Edytuj: Wygląda na to, że przed wydaniem wersji 3.4 zmieniono nazwę na na suppress.

+1

Nie jestem pewien, czy podoba mi się to rozwiązanie ... Chyba chodzi o to, że zastąpiliśmy 3 linie tylko 1 (próba, z tym wyjątkiem, że wszystkie są połączone w jedną). Najważniejszą rzeczą, której się sprzeciwiam, jest to, jak wprowadza to nowe słowo kluczowe, które wydaje się potwierdzać coś prawdopodobnie nie powinieneś robić ... wydaje się, że powinieneś zawsze przynajmniej rejestrować wyjątki, które łapiecie ... 14 paź. 132013-10-14 13:13:09

  0

Gdy wyjątek zostanie podniesiony, będzie kontynuował kod po próbie/haczyku lub cokolwiek znajdującym się poza ' z 'blokiem? 13 lis. 132013-11-13 07:45:05

+1

Jest to równoznaczne z zawijaniem kodu w 'try ... catch: pass', więc jeśli wyjątek zostanie podniesiony wewnątrz bloku, wykonanie będzie kontynuowane po końcu bloku. 14 lis. 132013-11-14 08:45:10

+4

@ JackO'Connor Cóż, to czyni go raczej bezużytecznym ... Myślałem, że po prostu zignoruje wyjątki zgodnie z obietnicą. 04 gru. 132013-12-04 20:21:50

+2

@ArtOfWarfare Co jeśli powiem, dam ci liczbę całkowitą, ale czasami dam ci ją w pojedynczej krotce i nie powiem ci kiedy robię jedną lub drugą; teraz twoim zadaniem jest zawsze oddać mi całkowitą liczbę? Być może doceniłbyś możliwość napisania czegoś takiego jak 'with suppress (TypeError): return data [0]' (dłuższy przykład: http://pastebin.com/gcvAGqEP) 02 maj. 142014-05-02 21:03:25

  0

@Navin Python nie może po prostu udawać, że wyjątek zrobił istnieje. Załóżmy, że mam instrukcję typu 'y = f (x) * g (x)', a następnie 'f (x)' podnosi wyjątek. Nawet jeśli Python je ignoruje, 'f (x)' nigdy nie zwraca wartości, więc Python nie ma możliwości przypisania wartości do 'y'. Projektanci mogliby powiedzieć "przyjąć wartość None" lub "pominąć instrukcje zawierające dowolne wyrażenie, które nie udało się ocenić", ale to w końcu byłoby bardzo mylące. Używanie bloków "try" do grupowania instrukcji, które zawodzą razem, sprawia, że ​​wszystko jest proste. 14 sty. 152015-01-14 17:14:23

  0

@ JackO'Connor Wystarczająco. Miałem nadzieję, że istnieje sposób na zastąpienie wyrażeń przez None, jeśli spowoduje to wyjątek. 14 sty. 152015-01-14 18:07:12

  0

Czy można to zrobić inline? Na przykład coś takiego jak 'supress (myFunc, suppressedException, returnValueOnFailure)'? 23 cze. 152015-06-23 01:43:01

  0

@JeromeJ nie można tego zrobić bezpośrednio z 'suppress', ponieważ jest to menedżer kontekstów. (Szczegółowe informacje o tym, jak działają menedżerowie kontekstu, zobacz tutaj: https://docs.python.org/3.4/library/stdtypes.html#typecontextmanager) Ale byłoby całkiem proste zdefiniowanie własnej funkcji 'callCatchingExceptions', która była używana 'lub zwykły blok' try' wewnątrz, jeśli chcesz. 24 cze. 152015-06-24 14:01:27

+1

FYI, django wycofaj użycie 'with suppress (Exception)' na 2017-09, ponieważ try/except działa lepiej. Sprawdź to zatwierdzenie [Odwrócono "Naprawiono # 27818 - Zastąpiono próbę/wyjdź/wyjdź z contextlib.su ...] (https://github.com/django/django/commit/6e4c6281dbb7ee12bcdc22620894edb4e9cf623f) 07 lis. 172017-11-07 07:00:17