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

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

#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или измените обработчик завершения.

Другие вопросы по тегам