Какой тип исключения генерируется при делении на ноль? - PullRequest
2 голосов
/ 29 января 2011

Какое исключение возникает при ошибке деления на ноль?Я попытался использовать «всеохватывающее» catch(...), но Visual Studio все еще жалуется, что есть необработанное исключение.

int a = 0;
try
{
    a /= a;
}
catch (/* what should I catch?*/)
{
    cout &lt&lt "divide by zero error" &lt&lt endl;
}

Примечание.(например, проверка, если а равен нулю, прежде чем делить на ноль).

1 Ответ

9 голосов
/ 29 января 2011

Это не вопрос C ++, потому что в стандартном C ++ этого сделать невозможно.

В Windows это создает Структурную обработку исключений исключение.

См. этот пример от MSDN:

__try 
{ 
    *pResult = dividend / divisor; 
} 
__except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ? 
         EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
{ 
    return FALSE;
}

Хотя это непереносимо и специфично для Windows.Последнее, что я знал, что GCC также не поддерживает его, даже в Windows.

Если вы задаете более широкий вопрос, то, как он работает, ваш ЦП будет генерировать прерывание, когда вы делите на ноль.Ядро Windows обрабатывает это и передает его вашему процессу, давая вам возможность справиться с этим.Если вы не справитесь с этим, ваш процесс умрет.В операционных системах типа Unix то же самое будет сохраняться, но это, вероятно, приведет к появлению сигнала.Я не уверен, какой именно.

Я бы сказал, что если вы хотите написать переносимый код C ++, то, вероятно, лучше проверять деление на ноль в программном обеспечении, а не полагаться на аппаратные средства для генерации ошибки и для ядра ОС длядоставить его вам через какой-нибудь непереносимый механизм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...