
У каждого, наверное, было: пишешь в интерпретаторе exit, а он:
>>> exit Use exit() or Ctrl-D (i.e. EOF) to exit
Что же такое exit? Оказывается это такой класс, а текст — это всего лишь его repr:
>>> type(exit) <class '_sitebuiltins.Quitter'> >>> repr(exit) 'Use exit() or Ctrl-D (i.e. EOF) to exit'
А еще есть quit – он тоже из этой семьи:
>>> type(quit) <class '_sitebuiltins.Quitter'>
Что же приходит при вывозе такого класса? Просто бросается исключение SystemExit, которое, между прочим, можно поймать. Попробуйте:
try: # выбери любое из: exit() quit() except SystemExit: print('Невозможно покинуть Омск')
Есть еще sys.exit, который тоже бросает SystemExit, что может быть пойман.
🛑 Вывод: нельзя надеятся на exit() для гарантированного завершения программы, ведь ваш код может быть обернут в try / except Exception, который может подавить SystemExit. Как же быть? Есть способ – это os._exit, который завершит программу на системном уровне:
import os try: os._exit(-1) except SystemExit: print('Невозможно покинуть Омск') finally: print('Я свободен!')
Ни первый, ни второй print не сработают!
✋ Надо упомянуть еще os.abort(), которая также немедленно завершает программу сигналом SIGABRT, что еще дополнительно приводит к созданию дампа памяти. Причем, не будет вызван даже обработчик сигнала, установленный через signal.signal(). Функция os.abort() подходит только для аварийного завершения приложения.
🐉 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈