考虑一个像这样的小程序:
int main()
{
freopen("./stdout.log", "w", stdout);
freopen("./stderr.log", "w", stderr);
int a = 1 / 0;
}
考虑到我的程序是由第三方软件运行的,因此我既不能更改程序的启动方式,也不能更改环境。
如何正确捕获除以零的Floating point exception (core dumped)
消息以及仍将打印在tty上的任何其他消息?
我试图在SO中搜索类似的答案,但由于这似乎很常见,我可能只是键入了错误的关键字。
答案 0 :(得分:2)
Matthieu Brucher的评论是正确的:
您需要捕获信号,这取决于平台。
从消息文本中,我推断您可能正在Linux平台上运行。如果是这样,您可以catch the SIGFPE
signal。
#include <stdexcept>
#include <signal.h>
// compile with -fnon-call-exceptions (for gcc)
signal(SIGFPE, [](int signum) { throw std::logic_error("FPE"); });
链接的答案具有C ++的一些优点,例如使用std::shared_ptr
进行信号处理器的RAII管理,并提及gcc使其工作所需的编译器标志。
Linux编程接口书也有一个pure-C example。
在Windows中,您可以使用Structured Exception Handling (SEH),并且概念类似(尽管不需要调用的功能)。
请注意,无论哪种情况,您都依赖于C ++未指定的特定于平台的行为(零除是未定义的行为),因此显然这不会导致可移植代码。