Как пропустить sys.exitfunc при возникновении необработанных исключений

Как видите, даже после того, как программа должна была умереть, она говорит из могилы. Есть ли способ «отменить регистрацию» функции выхода в случае исключений?

import atexit

def helloworld():
    print("Hello World!")

atexit.register(helloworld)

raise Exception("Good bye cruel world!")

выходы

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    raise Exception("Good bye cruel world!")
Exception: Good bye cruel world!
Hello World!
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
0
3 206
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы позвоните

import os
os._exit(0)

обработчики выхода не будут вызываться, ни ваши, ни зарегистрированные другими модулями приложения.

Ответ принят как подходящий

Я действительно не знаю, почему вы хотите это сделать, но вы можете установить excepthook, который будет вызываться Python при возникновении необработанного исключения, и в нем очистить массив зарегистрированной функции в модуле atexit.

Что-то такое :

import sys
import atexit

def clear_atexit_excepthook(exctype, value, traceback):
    atexit._exithandlers[:] = []
    sys.__excepthook__(exctype, value, traceback)

def helloworld():
    print "Hello world!"

sys.excepthook = clear_atexit_excepthook
atexit.register(helloworld)

raise Exception("Good bye cruel world!")

Помните, что он может вести себя некорректно, если исключение вызвано зарегистрированной функцией atexit (но тогда поведение было бы странным, даже если бы этот перехватчик не использовался).

В дополнение к вызову os._exit (), чтобы избежать зарегистрированного обработчика выхода, вам также необходимо перехватить необработанное исключение:

import atexit
import os

def helloworld():
    print "Hello World!"

atexit.register(helloworld)    

try:
    raise Exception("Good bye cruel world!")

except Exception, e:
    print 'caught unhandled exception', str(e)

    os._exit(1)

Другие вопросы по теме