当前位置:  开发笔记 > 编程语言 > 正文

如何在发生未处理的异常时跳过sys.exitfunc

如何解决《如何在发生未处理的异常时跳过sys.exitfunc》经验,为你挑选了1个好方法。

正如你所看到的,即使该计划应该已经死亡,它也会从坟墓中说出来.有没有办法在例外的情况下"取消注册"退出功能?

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 
    raise Exception("Good bye cruel world!")
Exception: Good bye cruel world!
Hello World!

Sylvain Defr.. 5

我真的不知道你为什么要这样做,但你可以安装一个异常的问题,每当引发一个未捕获的异常时它将由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注册的函数引发异常,它可能会表现不正确(但即使未使用此挂钩,行为也会很奇怪).



1> Sylvain Defr..:

我真的不知道你为什么要这样做,但你可以安装一个异常的问题,每当引发一个未捕获的异常时它将由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注册的函数引发异常,它可能会表现不正确(但即使未使用此挂钩,行为也会很奇怪).

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有