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

StackOverflow https://stackoverflow.com/questions/80993

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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 при каждом возникновении неперехваченного исключения, и с его помощью очищать массив зарегистрированных функций в 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 зарегистрированная функция (но тогда поведение было бы странным, даже если бы этот хук не использовался).

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

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

import os
os._exit(0)

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

Помимо вызова 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top