Если вы просто хотите попробовать, кроме как обработать исключение, как вы это делаете в Python?
Является ли следующий способ сделать это правильно?
try:
shutil.rmtree(path)
except:
pass
python
exception
try-except
Джоан Венге
источник
источник
shutil.rmtree(path, ignore_errors=True)
. Однако это не относится к большинству функций.try: rob() except: run()
Ответы:
или
Разница в том, что первый тоже будет ловить
KeyboardInterrupt
,SystemExit
и тому подобные вещи, которые получены напрямуюexceptions.BaseException
, а неexceptions.Exception
.Подробности смотрите в документации:
try
заявлениеисточник
try: shuti.rmtree(...) except: pass
будет грубо подавлять любые ошибки (даже если вы ошиблись вshutil
результате аNameError
) - по крайней мере, делатьexcept OSError:
Как правило, рекомендуется отлавливать только те ошибки, которые вас интересуют. В случае
shutil.rmtree
, вероятно, этоOSError
:Если вы хотите игнорировать эту ошибку, вы должны сделать:
Почему? Скажем, вы (как-то) случайно передали функции целое число вместо строки, например:
Он выдаст ошибку «TypeError: приведение к Unicode: нужна строка или буфер, int найдена» - вы, вероятно, не хотите игнорировать это, что может быть трудно отладить.
Если вы определенно хотите игнорировать все ошибки,
Exception
лучше использовать catch, а не простоexcept:
выражение. Опять же почему?Не указав исключение, перехватывается каждое исключение, включая
SystemExit
исключение, которое, например,sys.exit()
использует:Сравните это со следующим, который правильно выходит:
Если вы хотите написать код с лучшим поведением,
OSError
исключение может представлять различные ошибки, но в приведенном выше примере мы только хотим игнорироватьErrno 2
, поэтому мы можем быть еще более конкретными:источник
shutil.rmtree
это не лучший пример, потому что вы просто использовали быignore_errors=True
для этой функции ..Это зависит от того, что вы подразумеваете под «обработкой».
Если вы хотите поймать его без каких-либо действий, код, который вы разместили, будет работать.
Если вы имеете в виду, что хотите выполнить действие для исключения, не останавливая исключение при переходе вверх по стеку, то вам нужно что-то вроде этого:
источник
Сначала я процитирую ответ Джека О'Коннора из этой темы . Ссылочная тема закрыта, поэтому я пишу здесь:
«В Python 3.4 появился новый способ сделать это:
Вот коммит, который его добавил: http://hg.python.org/cpython/rev/406b47c64480
И вот автор, Рэймонд Хеттингер, говорит об этом и всякой другой горячности Python: https://youtu.be/OSGv2VnC0go?t=43m23s
Мое дополнение к этому является эквивалентом Python 2.7:
Затем вы используете его как в Python 3.4:
источник
Для полноты:
Также обратите внимание, что вы можете захватить исключение следующим образом:
... и повторно вызвать исключение следующим образом:
... примеры из учебника по питону .
источник
Есть несколько способов сделать это.
Однако выбор примера имеет простое решение, которое не распространяется на общий случай.
Специфично для примера:
Вместо
Сделай это:
Это аргумент, специфичный для
shutil.rmtree
. Вы можете увидеть справку по ней, выполнив следующее, и вы также увидите, что она также может учитывать и ошибки.Так как это охватывает только узкий случай примера, я дополнительно продемонстрирую, как справиться с этим, если эти ключевые аргументы не существуют.
Основной подход
Поскольку вышеизложенное охватывает только узкий случай примера, я дополнительно продемонстрирую, как справиться с этим, если эти ключевые аргументы не существуют.
Новое в Python 3.4:
Вы можете импортировать
suppress
менеджер контекста:Но подавим только самое конкретное исключение:
Вы будете молча игнорировать
FileNotFoundError
:Из документов :
Обратите внимание, что
suppress
иFileNotFoundError
доступны только в Python 3.Если вы хотите, чтобы ваш код работал и в Python 2, см. Следующий раздел:
Python 2 и 3:
Для Python 2-совместимого кода
pass
это правильный способ иметь оператор, который не работает. Но когда вы делаете голоеexcept:
, это то же самое , как делать ,except BaseException:
который включает в себяGeneratorExit
,KeyboardInterrupt
иSystemExit
, в общем, вы не хотите , чтобы поймать эти вещи.На самом деле, вы должны как можно точнее назвать исключение.
Вот часть иерархии исключений Python (2) , и, как вы можете видеть, если вы поймете более общие исключения, вы можете скрыть проблемы, которые вы не ожидали:
Вы, вероятно, хотите поймать здесь OSError, и, возможно, исключение, которое вас не волнует, это отсутствие каталога.
Мы можем получить этот конкретный номер ошибки из
errno
библиотеки и повысить его, если у нас его нет:Обратите внимание, что голый рейз вызывает исходное исключение, что, вероятно, то, что вы хотите в этом случае. Написано более кратко, поскольку нам не нужно явно указывать
pass
код при обработке исключений:источник
Это поможет вам напечатать, что такое исключение :( то есть попробуйте перехватить без обработки исключения и распечатать исключение.)
источник
Кстати, предложение else может идти после всех исключений и будет выполняться только в том случае, если код в попытке не вызывает исключение.
источник
else
в этом контексте. И добавить, что всегдаfinally
будет работать после любого (или без исключения).Мне нужно было игнорировать ошибки в нескольких командах и fuckit сделал свое дело
источник
В Python мы обрабатываем исключения, похожие на другие языки, но разница в некоторой синтаксической разнице, например,
источник
Я обычно просто делаю:
источник
_ = ""
наpass
.