Ловля всех необработанных исключений C++?

Я уже решил. Проблема была в том, что у меня был почтовый маршрут внутри api.php. Переместив его в web.php, он работает.

24
задан mdb 9 November 2008 в 18:45
поделиться

6 ответов

Это может использоваться для ловли, непредвиденные исключительные ситуации.

catch (...)
{
    cout << "OMG! an unexpected exception has been caught" << endl;
}

Без попытки ловят блок, я не думаю, что можно поймать исключения, так структурировать программу, таким образом, буксирный код исключения находится под контролем попытки/выгоды.

26
ответ дан 28 November 2019 в 22:20
поделиться

Можно использовать SetUnhandledExceptionFilter в Windows, который поймает все необработанные исключения SEH.

Обычно это будет достаточно для всех Ваших проблем как IIRC, все исключения C++ реализованы как SEH.

11
ответ дан 28 November 2019 в 22:20
поделиться

Без любого блока выгоды Вы не поймаете исключений. У Вас может быть выгода (...) блок в Вашем основном () (и его эквивалент в каждом дополнительном потоке). В этом блоке выгоды можно восстановить детали исключения, и можно сделать что-то о них, как вход и выход.

Однако существует также оборотная сторона об общей выгоде (...) блок: система находит, что исключение было обработано Вами, таким образом, это больше не дает справку. На Unix/Linux эта справка составила бы создание БАЗОВОГО файла, который Вы могли загрузить в отладчик и видеть исходное местоположение неисключенного исключения. При обработке его с выгодой (...), эта информация была бы уже потеряна.

В Windows, нет никаких БАЗОВЫХ файлов, таким образом, я предложил бы иметь выгоду (...) блок. От того блока Вы обычно вызывали бы функцию для возрождения фактического исключения:

std::string ResurrectException()
   try {
       throw;
   } catch (const std::exception& e) {
       return e.what();
   } catch (your_custom_exception_type& e) {
       return e.ToString();
   } catch(...) {
       return "Ünknown exception!";
   }
}


int main() {
   try {
       // your code here
   } catch(...) {
       std::string message = ResurrectException();
       std::cerr << "Fatal exception: " << message << "\n";
   }
}
8
ответ дан 28 November 2019 в 22:20
поделиться

Обновление : Это покрывает C++ 98 только.

От Более эффективный C++ Meyers (pg 76), Вы могли определить функцию, которая вызвана, когда функция генерирует исключение, которое не определяется его спецификацией исключения.

void convertUnexpected()
{
    // You could redefine the exception here into a known exception
    // throw UnexpectedException();

    // ... or I suppose you could log an error and exit.
}

В Вашем приложении регистрируют функцию:

std::set_unexpected( convertUnexpected );

Ваша функция convertUnexpected () будет вызвана, если функция генерирует исключение, которое не определяется его спецификацией исключения..., что означает, что это только работает при использовании спецификаций исключения.; (

7
ответ дан 28 November 2019 в 22:20
поделиться

Это - то, в чем я всегда выполняю основной ()

int main()
{
    try
    {
        // Do Work
    }
    catch(std::exception const& e)
    {
         Log(e.what());
         // If you are feeling mad (not in main) you could rethrow! 
    }
    catch(...)
    {
         Log("UNKNOWN EXCEPTION");
         // If you are feeling mad (not in main) you could rethrow! 
    }
}
4
ответ дан 28 November 2019 в 22:20
поделиться

Используйте выгоду (...) во всех Ваших барьерах исключения (не только основной поток). Я предлагаю, чтобы Вы всегда повторно бросили (...) и перенаправили стандартный вывод / ошибка к файлу журнала, поскольку Вы не можете сделать значимого RTTI на (...). OTOH, компилятор как GCC произведет довольно подробное описание о необработанном исключении: тип, значение какой () и т.д.

1
ответ дан 28 November 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: