Это не исключение.Это ошибка , которая определяется на уровне hardware и возвращается обратно в операционную систему, которая затем уведомляет об этом вашу программу определенным для ОС способом (например, убивая процесс).).
Я считаю , что в таком случае происходит не исключение, а сигнал.Если это так: операционная система прерывает основной поток управления вашей программы и вызывает обработчик сигнала, который, в свою очередь, прекращает работу вашей программы.
Это тот же тип ошибки, который появляется при разыменованиинулевой указатель (тогда ваша программа падает по сигналу SIGSEGV, ошибка сегментации).
Вы можете попробовать использовать функции из заголовка <csignal>
, чтобы попытаться предоставить собственный обработчик для сигнала SIGFPE (это для исключений с плавающей запятой), но это может быть случай, когда он также увеличивается для целочисленного деления на ноль - я действительно не уверен здесь).Однако следует помнить, что обработка сигналов зависит от ОС, и MinGW каким-то образом «эмулирует» сигналы POSIX в среде Windows.
Вот тест для MinGW 4.5, Windows 7:
#include <csignal>
#include <iostream>
using namespace std;
void handler(int a) {
cout << "Signal " << a << " here!" << endl;
}
int main() {
signal(SIGFPE, handler);
int a = 1/0;
}
Вывод:
Сигнал 8 здесь!
И сразу после выполнения обработчика сигнала система завершает процесс и отображает сообщение об ошибке.
Используя это, вы можете закрыть любые ресурсы или зарегистрировать ошибку после деления на ноль или разыменования нулевого указателя ... но в отличие от исключений, это НЕ способ контролировать поток вашей программы даже в исключительных случаях. Действительная программа не должна этого делать.Захват этих сигналов полезен только для целей отладки / диагностики.
(Есть некоторые полезные сигналы, которые в общем случае очень полезны при низкоуровневом программировании и не приводят к тому, что ваша программа сразу же уничтожается послеобработчик, но это глубокая тема).