Я пытаюсь поймать сигнал завершения в своем коде, чтобы записать файл перезапуска перед выходом.Мое решение основано на этом ответе .
#include <exception>
#include <csignal>
#include <iostream>
class InterruptException : public std::exception
{
public:
InterruptException(int _s) : signal_(_s) { }
int signal() const noexcept
{
return this->signal_;
}
private:
int signal_;
};
/// method to throw exception at signal interrupt
void sig_to_exception(int s)
{
throw InterruptException(s);
}
int main()
{
// activate signal handling
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = sig_to_exception;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
try
{
for (std::size_t i = 0; i < 100000000; ++i)
{
std::cout << i << std::endl;
}
}
catch (const InterruptException& e)
{
std::cout << "Received signal " << e.signal() << std::endl;
std::exit(1);
}
catch(...)
{
std::cout << "Other catch!" << std::endl;
}
}
Исключение генерируется нормально, однако мой блок catch не ловит его.Программа завершается с необработанным исключением InterruptException
.Я пытался с Clang и GCC на MacOS.Любая идея, почему исключение не перехвачено правильно?
Спасибо
Вывод при компиляции с g ++ 7.3.0:
terminate called after throwing an instance of 'InterruptException'
what(): std::exception
Abort trap: 6
Вывод при компиляции с Apple LLVM 9.0.0
libc++abi.dylib: terminating with uncaught exception of type InterruptException: std::exception
PS: Кажется, когда я компилирую с Apple LLVM, иногда ловится исключение, но не всегда, что делает это еще более странным.