Я уже решил. Проблема была в том, что у меня был почтовый маршрут внутри api.php. Переместив его в web.php, он работает.
Это может использоваться для ловли, непредвиденные исключительные ситуации.
catch (...)
{
cout << "OMG! an unexpected exception has been caught" << endl;
}
Без попытки ловят блок, я не думаю, что можно поймать исключения, так структурировать программу, таким образом, буксирный код исключения находится под контролем попытки/выгоды.
Можно использовать SetUnhandledExceptionFilter в Windows, который поймает все необработанные исключения SEH.
Обычно это будет достаточно для всех Ваших проблем как IIRC, все исключения C++ реализованы как SEH.
Без любого блока выгоды Вы не поймаете исключений. У Вас может быть выгода (...) блок в Вашем основном () (и его эквивалент в каждом дополнительном потоке). В этом блоке выгоды можно восстановить детали исключения, и можно сделать что-то о них, как вход и выход.
Однако существует также оборотная сторона об общей выгоде (...) блок: система находит, что исключение было обработано Вами, таким образом, это больше не дает справку. На 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";
}
}
Обновление : Это покрывает 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 () будет вызвана, если функция генерирует исключение, которое не определяется его спецификацией исключения..., что означает, что это только работает при использовании спецификаций исключения.; (
Это - то, в чем я всегда выполняю основной ()
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!
}
}
Используйте выгоду (...) во всех Ваших барьерах исключения (не только основной поток). Я предлагаю, чтобы Вы всегда повторно бросили (...) и перенаправили стандартный вывод / ошибка к файлу журнала, поскольку Вы не можете сделать значимого RTTI на (...). OTOH, компилятор как GCC произведет довольно подробное описание о необработанном исключении: тип, значение какой () и т.д.