Я понял завершается с неисследованным исключением хотя я думал, что поймал исключение. Вот пример кода
#include <iostream>
#include <stdexcept>
void throwing(int x)
{
if(x) throw std::runtime_error("x non-null");
}
int main()
{
try {
throwing(1);
} catch(std::runtime_error const&ex) {
std::clog << "error: \"" << ex.what() << '\"' << std::endl;
std::terminate();
}
return 0;
}
который производит (после сообщения ошибка: «x ненулевой») указанное сообщение (используя clang ++ с std=c++11
). Так когда именно так было ли исключение поймано и, следовательно, считается непойманный в том смысле terminate()
не сообщать об этом (снова)? Или, эквивалентно (или нет?): Как я могу поймать исключение, сообщить о его what()
, а также terminate()
без этой рекламы?
(Я мог бы воздержаться от сообщения what()
и просто terminate()
, но я хочу сообщить what()
по-своему.)
Поскольку никто не дал ответа на этот вопрос, и кажется, что мой комментарий был либо недостаточно ясен, либо пропущен, я выложу полный ответ:
Или, что то же самое (или нет?): Как я могу поймать исключение, сообщить о чем () и завершить (), не получая эту ошибку?
Если вы внимательно прочитали через ссылка, вы заметите std::terminate()
по умолчанию звонки abort()
, что приводит к прекращению возврата программы в зависимости от платформы неудачное завершение Код ошибки для среды хоста.
Теперь, отвечая на цитируемый вопрос: либо используйте exit(int status)
(который является лучшее решение, так как вы обработали исключение) вместо terminate
, или же менять завершить обработчик.