Python: Как игнорировать исключение и продолжать выполнение?
У меня есть блок try...except в коде, и когда возникает исключение, я просто хочу продолжить выполнение программы, поскольку в этом случае всё остальное работает нормально. Проблема в том, что если оставить блок except: пустым или использовать #do nothing, возникает синтаксическая ошибка. Я не могу использовать continue, так как это не в цикле. Есть ли какое-то ключевое слово, которое можно использовать, чтобы указать коду просто продолжать выполнение?
3 ответ(ов)
Общее
Стандартным эквивалентом "nop" в Python является команда pass
:
try:
do_something()
except Exception:
pass
Использование except Exception
вместо общего except
позволяет избежать перехвата исключений, таких как SystemExit
, KeyboardInterrupt
и т.д.
Python 2
В Python 2 последняя брошенная ошибка запоминается, в результате чего некоторые объекты, участвующие в процессе возбуждения исключения, остаются в активном состоянии бесконечно (фактически, до следующего исключения). Если это имеет для вас значение и (как правило) вам не нужно запоминать последнее брошенное исключение, вы можете использовать следующий код вместо pass
:
try:
do_something()
except Exception:
sys.exc_clear()
Это очистит последнее брошенное исключение.
Python 3
В Python 3 переменная, содержащая экземпляр исключения, удаляется при выходе из блока except
. Даже если переменная имела значение ранее, после входа и выхода из блока except
она снова становится неопределенной.
В Python 3.4 появился новый способ обработки исключений:
from contextlib import suppress
with suppress(Exception):
# ваш код
Вот коммит, который добавил эту функциональность: http://hg.python.org/cpython/rev/406b47c64480.
А вот автор, Реймонд Хеттингер, рассказывает об этом и других интересных новшествах в Python (релевантная часть начинается на 43:30): http://www.youtube.com/watch?v=OSGv2VnC0go.
Если вам нужно эмулировать простое ключевое слово except
и также игнорировать такие исключения, как KeyboardInterrupt
— хотя это обычно не рекомендуется — вы можете использовать with suppress(BaseException)
.
П.С. Похоже, что ignored
было переименовано в suppress
перед выпуском 3.4.
Попробуйте сделать так:
try:
blah()
except:
pass
При использовании конструкции try...except
, вы пытаетесь выполнить функцию blah()
. Если возникает исключение, оно игнорируется благодаря инструкции pass
, и выполнение программы продолжается. Однако будьте осторожны, так как перехват всех исключений без обработки может скрыть ошибки, что затрудняет отладку. Лучше указывать конкретные исключения, которые вы ожидаете. Например:
try:
blah()
except SomeSpecificException:
pass
Это поможет вам избежать потенциальных проблем и сделает ваш код более надежным.
Как проверить, существует ли переменная?
Как протестировать, что функция Python вызывает исключение?
Получить описание исключения и стек вызовов, вызвавших исключение, в виде строки
Зачем в Python нужен блок "finally"?
Переизбрасывание исключения в Python с сохранением трассировки стека