Python: Как игнорировать исключение и продолжить?


239

У меня есть попытка ... кроме блока в моем коде и когда возникает исключение. Я просто хочу продолжить код, потому что в этом случае все по-прежнему может работать нормально. Проблема в том, что если вы оставите за исключением: block empty или с #do ничего, это даст вам синтаксическую ошибку. Я не могу использовать continue, потому что он не в цикле. Есть ли ключевое слово, которое я могу использовать, которое говорит, что код просто продолжает идти?

359
except: 
    pass 
+64

кроме исключения: пропустите # важно не проглотить другие исключения! 22 фев. 092009-02-22 16:46:45

+8

@ Аарон - Я согласен, но вопрос был не в том, что это была хорошая/плохая идея. 23 фев. 092009-02-23 20:05:24

+15

Это поймает SystemExit, KeyboardInterrupt и другие вещи, которые вы, вероятно, не захотите поймать. 02 янв. 102010-01-02 01:13:31

+1

Он не поймает KeyboardInterrupt. Например: 'в то время как True:' ' попробовать: ' F = открытый ('filedoesnotexist.txt') '' за исключением: '' pass' KeyboardInterrupt останавливается и выходит код. 24 июл. 122012-07-24 15:59:51

+14

@ChthonicProject: голый 'except' поймает любое исключение, включая KeyboardInterrupt, но только если это произойдет внутри' try'. В вашем примере там, KeyboardInterrupt может произойти до 'try' или внутри' except', где он не будет пойман. Если вы используете пример типа 'while True:' 'try: pass'' except: pass', вы обнаружите, что KeyboardInterrupt попадает примерно в 50% случаев. Если вы 'time.sleep (1)' внутри 'try', вы обнаружите, что он попадает почти каждый раз. 22 мар. 132013-03-22 08:39:50


12

Попробуйте это:

try: 
    blah() 
except: 
    pass 

202

Стандарт "NOP" в Python является pass заявление:

try: 
    do_something() 
except Exception: 
    pass 

Из-за последнего брошенного исключения будучи запоминаются в Python, некоторые из объекты, участвующие в выражении исключения, сохраняются в реальном времени на неопределенный срок (фактически до следующего исключения). В случае, если это важно для вас, и (обычно) вам не нужно запоминать последнее брошенное исключение, вы можете сделать следующее вместо pass:

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

Это очищает последнее брошенное исключение.

+26

Это лучший ответ, чем тот, который был принят, потому что он использует «except Exception:» вместо «except», который, как указывали другие, будет неправильно проглатывать другие вещи, которые вы не хотите поймать, как SystemExit и KeyboardInterrupt , 11 июл. 112011-07-11 21:50:28

+4

+1 Он также очищает ошибку, которая важна при запуске unittests и ожидании исключений. 26 окт. 112011-10-26 13:50:55

  0

Обратите внимание, что 'exc_clear' был удален в python 3. https: // docs.python.org/3/whatsnew/3.0.html#index-22. Для некоторых способов решения этой проблемы в Python 3 см. Здесь: https://cosmicpercolator.com/2016/01/13/exception-leaks-in-python-2-and-3/ 06 мар. 182018-03-06 18:59:18


114

Там новый способ сделать это идет в Python 3.4:

from contextlib import suppress 

with suppress(Exception): 
    # your code 

Вот коммит, который добавил его: http://hg.python.org/cpython/rev/406b47c64480

А вот автор, Раймонд Hettinger, говорить об этом, и все виды другой Python жаркость (отношение бит в 43:30): http://www.youtube.com/watch?v=OSGv2VnC0go

Если вы хотите эмулировать голую except ключевое слово, а также игнорировать такие вещи, как KeyboardInterrupt -though вы обычно не-вы могли бы использование with suppress(BaseException).

Редактировать: Похоже, ignored был переименован в suppress перед выпуском 3.4.

+1

Я не уверен, что мне нравится это решение ... Я думаю, идея состоит в том, что мы заменили 3 строки только 1 (try, except и pass слиты в один.) Главное, на что я возражаю, это то, как это вводит новое ключевое слово, которое, кажется, оправдывает что-то вы, вероятно, не должны делать ... похоже, что вы всегда должны, по крайней мере, регистрировать исключения, которые вы ловите ... 14 окт. 132013-10-14 13:13:09

  0

Когда возникает исключение, он будет продолжать код после try/catch или что-либо еще вне ' с блоком? 13 ноя. 132013-11-13 07:45:05

+1

Это эквивалентно обертыванию кода в 'try ... catch: pass', поэтому, если в блоке создается исключение, выполнение будет продолжаться после окончания блока. 14 ноя. 132013-11-14 08:45:10

+4

@ JackO'Connor Ну, это делает его бесполезным ... Я думал, что он просто проигнорирует исключения, как обещал. 04 дек. 132013-12-04 20:21:50

+2

@ArtOfWarfare Что, если я скажу, я дам вам целое число, но иногда я дам его вам в одноэлементном кортеже, и я не буду говорить вам, когда я делаю то или другое; теперь ваша задача - всегда вернуть мне целое число? Возможно, вы хотели бы написать что-то вроде 'with suppress (TypeError): return data [0]' (более длинный пример: http://pastebin.com/gcvAGqEP) 02 май. 142014-05-02 21:03:25

  0

@Navin Python не может просто притворяться, что исключение не существует. Предположим, что у меня есть инструкция типа 'y = f (x) * g (x)', а затем 'f (x)' вызывает исключение. Даже если Python игнорирует его, 'f (x)' никогда не возвращает значение, поэтому для Python нет возможности присвоить значение 'y'. Дизайнеры могли сказать «принять значение« Нет »или« пропустить утверждения, содержащие любое выражение, которое не удалось оценить », но это в конечном итоге будет очень запутанным. Использование блоков 'try' для группирования операторов, которые не работают вместе, упрощает процесс. 14 янв. 152015-01-14 17:14:23

  0

@ JackO'Connor достаточно. Я надеялся, что был бы способ заменить выражения None, если он вызывает исключение. 14 янв. 152015-01-14 18:07:12

  0

Можно ли это сделать inline? Например, что-то вроде 'supress (myFunc, suppressedException, returnValueOnFailure)'? 23 июн. 152015-06-23 01:43:01

  0

@JeromeJ вы не можете сделать это с 'suppress' напрямую, потому что это менеджер контекста. (Подробнее о том, как работают контекстные менеджеры, см. Здесь: https://docs.python.org/3.4/library/stdtypes.html#typecontextmanager). Было бы довольно просто определить вашу собственную функцию 'callCatchingExceptions', которая использовала' suppress 'или обычный' try' блок внутри, если хотите. 24 июн. 152015-06-24 14:01:27

+1

FYI, django возвращает использование 'with suppress (Exception)' в 2017-09, потому что try/except работает лучше. Проверьте это. [Reverted] Исправлено # 27818 - Заменено try/except/pass с contextlib.su ...] (https://github.com/django/django/commit/6e4c6281dbb7ee12bcdc22620894edb4e9cf623f) 07 ноя. 172017-11-07 07:00:17