5

おわかりのように、プログラムが死んだはずの後でさえ、それは墓場から語りかけます。例外が発生した場合に exitfunction を「登録解除」する方法はありますか?

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!
4

3 に答える 3

5

なぜそれをしたいのかよくわかりませんが、キャッチされていない例外が発生するたびにPythonによって呼び出されるexcepthookをインストールし、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(ただし、このフックが使用されていなくても、動作はおかしくなっていました)。

于 2008-09-17T08:21:20.027 に答える
0

電話すれば

import os
os._exit(0)

終了ハンドラーは呼び出されません。あなたのものでも、アプリケーション内の他のモジュールによって登録されたものでもありません。

于 2008-09-17T08:15:58.883 に答える
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)
于 2008-09-17T08:25:14.713 に答える