Когда именно было обнаружено исключение?
Я получаю это завершение с неисследованным исключением, хотя я думал, что поймал исключение. Вот пример кода
#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()
по-своему.)
1 ответ
Поскольку никто не дал ответа на этот вопрос, и кажется, что мой комментарий был либо недостаточно ясен, либо пропущен, я выложу полный ответ:
Или, что то же самое (или нет?): Как я могу поймать исключение, сообщить о чем () и завершить (), не получая эту ошибку?
Если вы внимательно прочитаете ссылку, вы заметите, std::terminate()
по умолчанию звонки abort()
Это приводит к тому, что программа прекращает возвращать зависящий от платформы код ошибки неудачного завершения в среду хоста.
Теперь, отвечая на цитируемый вопрос: либо используйте exit(int status)
(что является лучшим решением, поскольку вы обработали исключение) вместо terminate
или измените обработчик завершения.