问题标签 [atexit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 如何注册仅在 Python 程序*成功*退出时调用的函数?
我想在我的 Python 程序完成时运行一个任务,但前提是它成功完成。据我所知,使用 atexit 模块意味着我注册的函数将始终在程序终止时运行,无论成功与否。是否有类似的功能来注册一个函数,以便它只在成功退出时运行?或者,我的退出函数有没有办法检测退出是正常的还是异常的?
这是一些演示问题的代码。它将打印程序成功,即使它失败了。
输出:
c - atexit() 处的 Execv 注册问题
“在调用进程映像中由 atexit() 注册的任何函数都未在新进程映像中注册”。
这是代码:
check_mem 函数在 execv() 之后没有被调用。因为上面的“线”。在 execv 调用后注册函数的任何技巧?
在此先感谢您的帮助。
c - vfork() atexit 断言失败
我正在尝试理解以下代码
并且请不要告诉我 vfork() 是坏的和这类事情。我知道是这样,但是这段代码中究竟发生了什么导致这种错误。提前致谢
c++ - 将值传递给 atexit
我想根据需要推送一系列清理功能。我正在使用 atexit 为一个没有任何参数的清理函数执行此操作,但我不确定如何将这种方法扩展到一个以上的清理函数。我对 boost::bind 不是很熟悉,但认为这是一个好主意,因为这就是我将函数绑定到线程的方式......
在 c++ 中,我试图让以下工作:
功能定义
代码:
错误:
提前致谢!
dll - 混合模式 C++/CLI DLL 在退出时抛出异常
我创建的 C++/CLI 混合模式 DLL 有问题。当使用它的 .NET 应用程序退出时,它会在卸载时引发异常。执行后DLL_PROCESS_DETACH
,DLL 使用自动注册的函数进行运行时清理,atexit() / __onexit()
并引发以下异常:
我已将问题追溯到atexit()
由静态提升异常对象注册的调用get_static_exception_object()
。
我在大多数情况下都使用静态链接的 boost_1_47,除了动态链接的 boost::thread 以避免加载器锁定。我也尝试过动态链接所有没有帮助的提升。#pragma unmanaged
此外,所有的提升包括都被块包围。
我希望有人遇到过类似的问题或知道解决方案吗?
谢谢,马克
这是异常发生之前的调用堆栈:
c - 检索对通过 atexit() 注册的函数的引用
对于使用注册的函数atexit()
:是否可以检索对它们的引用,直接调用它们?
尽管这是一个一般性问题,但欢迎使用gcc
/glibc
的解决方案。
python - 在注册的 atexit 函数中获取错误回溯
我正在尝试记录导致我的进程关闭的错误,但traceback.print_tb
似乎traceback.print_exc
没有意识到引发的错误是什么。
换句话说,为什么下面会打印 'None\n' 而不是 'DivisionByZero .. etc ..'?(编辑:..以及如何从 exit_fn 中访问引发/处理的错误?)
visual-c++ - 应用程序关闭时崩溃 - atexit 问题?
我们的一个进程在应用程序关闭期间崩溃。ErrorHandlingClient 是一个 dll。我在故障转储中看到了这一行:
"`CErrorLog::m_IErrorHandlingServerPtr 的动态 atexit 析构函数"
我也在堆栈溢出中搜索了msdn;我无法得到明确的答案。我们的应用程序被移植到 vc 9.0 编译器。对于早期版本,此问题不会发生。我正在粘贴故障转储。
python - 在 Python 中调用 atexit 回调时如何查找退出代码或原因?
我想知道 Python 脚本是否正确终止。为此,我正在使用atexit
,但问题是我不知道如何区分 atexit 是使用 sys.exit(0) 还是非零或异常调用的。
推理:如果程序正确结束,它什么也不做,但如果程序以异常结束或返回不同于零的错误代码(退出状态)我想触发一些动作。
如果您想知道为什么我不使用 try/finally 是因为我想为导入公共模块的十几个脚本添加相同的行为。我不想修改所有这些,而是想将 atexit() hack 添加到正在导入的模块中,并在所有这些模块中免费获得此行为。
python - 多处理、atexit 和全局数据出错
提前抱歉,这会很长......
可能相关:
Python 多处理 atexit 错误“atexit._run_exitfuncs 中的错误”
绝对相关:
具有全局数据的python并行映射(multiprocessing.Pool.map)
这是我一起破解的“简单”脚本来说明我的问题......
如果没有引发 KeyboardInterrupt,这工作得很好。但是,如果我提出一个,则会发生以下异常:
有趣的是,代码确实退出了 Pool.map 函数而不调用任何其他函数......问题似乎是 KeyboardInterrupt 在某些时候没有正确处理,但它在哪里有点令人困惑,并且为什么不以可中断方式处理它。谢谢。
注意,如果我使用同样的问题 out=p.map_async(wrapper,range(30)).get()
编辑 1
更接近一点......如果我将它包含out=p.map(...)
在一个try,except,finally
子句中,它会消除第一个异常......但是,其他异常仍然在 atexit 中提出。上面的代码和回溯已经更新。
编辑 2
其他不起作用的内容已作为注释添加到上面的代码中。(同样的错误)。这次尝试的灵感来自:
http://jessenoller.com/2009/01/08/multiprocessingpool-and-keyboardinterrupt/
编辑 3
使用添加到上述代码中的信号的另一次尝试失败。
编辑 4
我已经想出了如何重组我的代码,以便不再需要上述内容。如果(不太可能)有人偶然发现这个线程与我有相同的用例,我将描述我的解决方案......
用例
我有一个使用tempfile
模块生成临时文件的函数。我希望在程序退出时清理这些临时文件。我最初的尝试是将每个临时文件名打包到一个列表中,然后使用通过atexit.register
. 问题是更新的列表没有跨多个进程更新。这就是我想到使用multiprocessing.Manager
它来管理列表数据的地方。不幸的是,KeyboardInterrupt
无论我多么努力,这都失败了,因为进程之间的通信套接字由于某种原因被破坏了。这个问题的解决方案很简单。在使用多处理之前,设置临时文件目录......类似tempfile.tempdir=tempfile.mkdtemp()
然后注册一个函数来删除临时目录。每个进程都写入同一个临时目录,因此它可以工作。 当然,此解决方案仅适用于共享数据是在程序生命周期结束时需要删除的文件列表的情况。