是否可以在各种失败情况下(例如异常)在程序终止前自动刷新 std::cout
Is it possible to make std::cout flush automatically before program termination in various failure cases (e.g., exception)
如果抛出异常,则缺少刷新的标准输出会使诊断问题变得更加困难。是否有任何缓解措施可以使用? (例如,终止挂钩、编译器标志等)。我可以理解在段错误中它可能很难刷新,但我认为对于任意线程中未捕获的异常,它至少在理论上应该是可能的。
注意:由于可能使用多线程,情况稍微复杂一些。所以在 main
中捕获异常对其他线程不起作用。
当程序由于未捕获的异常而终止时,将调用std::terminate
。这将调用已使用 std::set_terminate
注册的终止处理程序。在此终止处理程序中,您可以刷新标准输出流。
std::terminate
在其他一些情况下也会被调用,例如从 noexcept
函数中抛出异常,破坏可连接 std::thread
,直接从用户代码调用等
如果程序被操作系统终止,这没有帮助。那只能用disabling buffering来解决。您可以 尝试 将信号处理程序刷新为绝望的措施,但这不能保证成功,也不能保证有预期的行为,因为刷新不是异步安全操作。
如果抛出异常,则缺少刷新的标准输出会使诊断问题变得更加困难。是否有任何缓解措施可以使用? (例如,终止挂钩、编译器标志等)。我可以理解在段错误中它可能很难刷新,但我认为对于任意线程中未捕获的异常,它至少在理论上应该是可能的。
注意:由于可能使用多线程,情况稍微复杂一些。所以在 main
中捕获异常对其他线程不起作用。
当程序由于未捕获的异常而终止时,将调用std::terminate
。这将调用已使用 std::set_terminate
注册的终止处理程序。在此终止处理程序中,您可以刷新标准输出流。
std::terminate
在其他一些情况下也会被调用,例如从 noexcept
函数中抛出异常,破坏可连接 std::thread
,直接从用户代码调用等
如果程序被操作系统终止,这没有帮助。那只能用disabling buffering来解决。您可以 尝试 将信号处理程序刷新为绝望的措施,但这不能保证成功,也不能保证有预期的行为,因为刷新不是异步安全操作。