try-except не перехватывает исключения

    try:
        print('=====ДО=====')
        os.remove(file)
        print('=====ПОСЛЕ=====')
    except:
        print('Этот принт выполняется')
        exit(f'Не удаляется {file}')

Впервые с таким сталкиваюсь. Может быть кто знает объяснение. Блок except не срабатывает.

def rrr():
    try:
        1/0
    except:
        exit(10000)

try:
    rrr()
except:
    print(54545)

выполнение rrr() - дает вывод 10000 выполнение всего кода давет вывод 54545, хотя ожидал того же 10000

Выполнение в консоли:

введите сюда описание изображения

Выполнение во вкладке RUN. Результат неожиданно разный.

введите сюда описание изображения


Ответы (1 шт):

Автор решения: CrazyElf

Ну на самом деле вы просто не понимаете, как в питоне происходит выход из программы по sys.exit. При этом просто бросается исключение SystemExit. Так устроен питон. И это исключение ловится у вас во внешнем блоке try/except. Именно поэтому важно прописывать конкретные исключения, которые вы хотите ловить в блоке except, а не ловить все исключения подряд.

Если ловить хотя бы Exception, то SystemExit уже не поймается:

try:
    rrr()
except Exception:
    print(54545)

Вывод:

SystemExit: 10000

Это потому, что исключение SystemExit унаследовано от BaseException, а не от Exception.

Почему получается разный результат в консоли и в PyCharm не подкажу, но, видимо, это тоже как-то завязано на обработку исключения SystemExit самой средой выполнения (интерактивным питоном в каком-то из случаев, видимо).

→ Ссылка