Как пропустить sys.exitfunc при возникновении необработанных исключений - PullRequest
4 голосов
/ 17 сентября 2008

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

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!

Ответы [ 3 ]

5 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

В дополнение к вызову 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)
0 голосов
/ 17 сентября 2008

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

import os
os._exit(0)

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

...