Когда именно было обнаружено исключение?

Я понял завершается с неисследованным исключением хотя я думал, что поймал исключение. Вот пример кода

#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() по-своему.)

0

Решение

Поскольку никто не дал ответа на этот вопрос, и кажется, что мой комментарий был либо недостаточно ясен, либо пропущен, я выложу полный ответ:

Или, что то же самое (или нет?): Как я могу поймать исключение, сообщить о чем () и завершить (), не получая эту ошибку?

Если вы внимательно прочитали через ссылка, вы заметите std::terminate() по умолчанию звонки abort(), что приводит к прекращению возврата программы в зависимости от платформы неудачное завершение Код ошибки для среды хоста.

Теперь, отвечая на цитируемый вопрос: либо используйте exit(int status) (который является лучшее решение, так как вы обработали исключение) вместо terminate, или же менять завершить обработчик.

2

Другие решения


По вопросам рекламы [email protected]