如果抛出异常,则缺少刷新的标准输出会使诊断问题变得更加困难。 是否有任何减轻措施可以使用? (例如,终止挂钩,编译器标志等)。 我可以理解在segfault中可能很难刷新,但我认为对于任意线程中未捕获的异常,至少在理论上应该是可能的。
注意:由于可能使用多个线程,情况会稍微复杂一些。 因此在main
中捕获异常对其他线程不起作用。
当程序因未捕获异常而终止时,将调用std::terminater
。 这将调用已使用std::set_terminate
注册的terminate处理程序。 在这个terminate处理程序中,您可以刷新标准输出流。
std::terminater
在其他一些情况下也被调用,例如从noexcept
函数中抛出异常,破坏可连接的std::thread
,从用户代码直接调用等。
如果程序被操作系统终止,这就无济于事。 这只能通过禁用缓冲来解决。 您可以尝试刷新信号处理程序作为一种绝望的措施,但这并不能保证成功,也不能保证有期望的行为,因为刷新不是异步安全操作。