Как перехватить исключения системного уровня в Linux C++?
Вопрос
Следующий метод catch() не вызывается:
void test(void)
{
int i=1,j=0,k;
try
{
k = i/j;
}
catch(...)
{
...handle it...
}
}
Есть ли способ поймать такое исключение?
Решение
Пожалуйста, проверьте http://linux.die.net/man/1/gcc для этого есть опция компилятора -mcheck-zero-Division.
В качестве альтернативы можно установить обработчик SIGFPE, Затем функция с плавающей точкой, равная 0, сгенерирует FPE_ZERODIVIDE
signal(SIGFPE, (fptr) FPE_ExceptionHandler);
void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/)
{
switch(nErrType)
{
case FPE_ZERODIVIDE: /* ??? */ break;
}
}
с тех пор
Большинство систем с плавающей запятой основаны на стандарте IEEE, который допускает деление на 0. Это возвращает либо положительную бесконечность, либо отрицательную бесконечность, в зависимости от ситуации, на основе знаков чисел. (За исключением 0/0 возвращает неопределенный NAN - опять-таки не исключительный случай.) Это имеет тенденцию быть полезным для научных и математических приложений. NAN эффективно сигнализируют о случае, когда вычисления не были возможны, но позволяют вычислениям продолжаться. Продолжение расчетов не даст новых результатов, но будет продолжать возвращать NAN. Это позволяет выполнять длинные длинные цепочки вычислений без проверки ошибок в пределах вычислений. Проверки ошибок необходимо выполнять только в самом конце работы. Это делает код намного проще и быстрее. Иногда это также может быть более полезным, так как для некоторых приложений инфинитность является «полезной». результат, на самом деле не признак проблем.
Другие советы
Нет - исключение не выдается (вы получаете сигнал - возможно, SIGFPE). Вам нужно проверить возможное деление на нули в своем коде, а затем самостоятельно выдать исключение,
Если это вообще вызывает ошибку во время выполнения (см. Хорошая дискуссия Лакшманараджа о математике IEEE, хотя некоторые компиляторы позволяют вам вызывать ошибки вместо NaN), он выдает исключение с плавающей запятой сигнал.
Сигналы представляют собой механизм, отличный от исключений C++, и обрабатываются на уровне ОС.Уже существует ряд вопросов SO, касающихся механизма сигналов *nix, в том числе:
Что касается окон, вам придется спросить кого-нибудь другого.Mac OS X, конечно, является системой, производной от Unix.