Как перехватить исключения системного уровня в Linux C++?

StackOverflow https://stackoverflow.com/questions/618215

Вопрос

Следующий метод 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top