У меня проблема с тестером, что мое приложение вылетает при инициализации. Я добавил больше протоколирования и обработки исключений, но он по-прежнему вылетает с общим сообщением «Эта программа перестала работать» вместо того, чтобы запускать мою обработку ошибок.

Учитывая, что мой main () выглядит так и имеет catch(...), при каких обстоятельствах это не сработает?

try{
    simed::CArmApp app(0, cmd);
    for(bool done = false;!done;) 
    {
        done = !app.frame();
    }
} catch(const std::runtime_error &e){
    handleApplicationError(e.what());
    return -1;
} catch(...) {
    handleApplicationError("Unknown Error");
    return -999;
}

Мой код обращается к библиотеке, выполняющей рендеринг OpenGL, и я считаю, что здесь что-то идет не так.

14
Mr. Boy 8 Май 2014 в 17:38

4 ответа

Лучший ответ

Если блок C ++ catch(...) не обнаруживает ошибок, возможно, это из-за ошибки Windows.

В Windows существует концепция под названием Структурированная Обработка исключений, когда ОС вызывает «исключения», когда происходят плохие вещи, такие как разыменование недействительного указателя, деление на ноль и т. Д. Я говорю «исключения», потому что это не исключения C ++; скорее это критические ошибки, которые Windows определяет в стиле C - это потому, что Win32 был написан на C, поэтому исключения C ++ были нежизнеспособны.

Смотрите также:

Обновление на основе комментариев

Если вам нужна как обработка исключений C ++, так и SEH, возможно, вы могли бы попробовать следующий (непроверенный) код:

__try
{
    try
    {
        // Your code here...
    }
    catch (std::exception& e)
    {
        // C++ exception handling
    }
}
__except(HandleStructuredException())
{
    // SEH handling 
}
22
Community 23 Май 2017 в 12:03

Насколько я знаю, могут быть как минимум две ситуации, когда catch(...) не может поймать

  1. Более 1 необработанного исключения: когда исключение возникает до обработки ранее возникшего исключения, C ++ не может его обработать, и приложение выйдет из строя.
  2. Создание исключения, которого нет в списке спецификации исключений: если какой-либо метод вызывает исключение, которого нет в списке спецификации исключений ( в любом ), тогда unexpected будет называется, который вызывает abort.
7
Rakib 8 Май 2014 в 14:12

Если деструктор объекта, уничтоженного в результате раскручивания стека для обработки другого исключения, выбрасывает исключение, программа завершится, catch(...) или нет.

6
dlf 8 Май 2014 в 13:47

Вы объявляете какие-либо глобальные объекты? Если у вас есть какие-либо объекты, созданные вне вашего основного цикла, это может объяснить, почему он не перехвачен (его нет в вашем try-catch).

1
Bhargav Rao 5 Июн 2020 в 14:13