try:
doSomething()
except:
pass
или
try:
doSomething()
except Exception:
pass
Разница в том, что первый также поймает KeyboardInterrupt
, SystemExit
и тому подобное, которые получены непосредственно из exceptions.BaseException
, а не exceptions.Exception
.
Подробности см. В документации:
Как правило, рекомендуется отлавливать только те интересующие вас ошибки. В случае shutil.rmtree
это, вероятно, OSError
:
>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
[...]
OSError: [Errno 2] No such file or directory: '/fake/dir'
Если вы хотите игнорировать эту ошибку, вы должны сделать:
try:
shutil.rmtree(path)
except OSError:
pass
Почему? Скажем, вы (как-то) случайно передали функции целое число вместо строки, например:
shutil.rmtree(2)
Это выдаст ошибку "TypeError: приведение в Unicode:
Если вы просто хотите сделать попытку catch без обработки исключения, как вы это делаете в Python?
Это зависит от того, что вы подразумеваете под «обработкой».
Если вы хотите перехватить его, не предпринимая каких-либо действий, отправленный вами код будет работать.
Если вы имеете в виду, что вы хотите выполнить действие для исключения без остановки исключение от подъема в стек, тогда вы хотите что-то вроде этого:
try:
do_something()
except:
handle_exception()
raise #re-raise the exact same exception that was thrown
try:
doSomething()
except Exception:
pass
else:
stuffDoneIf()
TryClauseSucceeds()
К вашему сведению, предложение else может идти после всех исключений и будет запускаться только в том случае, если код в попытке не вызывает исключения.
Для полноты:
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print "division by zero!"
... else:
... print "result is", result
... finally:
... print "executing finally clause"
... из учебника python .
Также обратите внимание, что вы можете зафиксировать исключение следующим образом:
>>> try:
... this_fails()
... except ZeroDivisionError as detail:
... print 'Handling run-time error:', detail