Когда вы просто хотите выполнить try-except без обработки исключения, как вы делаете это на Python?
Правильный ли способ сделать это следующим образом?
try: shutil.rmtree(path) except: pass
Переведено автоматически
Ответ 1
try: doSomething() except Exception: pass
или
try: doSomething() except: pass
Разница в том, что второй также будет перехватывать KeyboardInterrupt, SystemExit и тому подобное, которые являются производными непосредственно от BaseException, а не 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: нужна строка или буфер, найден int" - вероятно, вы не захотите игнорировать это, что может быть сложно отладить.
Если вы определенно хотите игнорировать все ошибки, используйте catch Exception, а не голый except: оператор. Опять же, почему?
Без указания исключения перехватывается каждое исключение, включая SystemExit исключение, которое, например, sys.exit() использует:
Если вы хотите написать код с более совершенным поведением, то OSError исключение может представлять различные ошибки, но в приведенном выше примере мы хотим только игнорировать Errno 2, поэтому мы могли бы быть еще более конкретными:
import errno
try: shutil.rmtree(path) except OSError as e: if e.errno != errno.ENOENT: # ignore "No such file or directory", but re-raise other errors raise
Ответ 3
Сначала я процитирую ответ Джека о'Коннора из этой темы. Упомянутый поток был закрыт, поэтому я пишу здесь: