Разрезание исключения - действительно ли это происходит из-за сгенерированного конструктора копии?

Для ссылки, подобного потока: я должен поймать исключения только для входа их?

Угловые точки - то, что Вы хотите эффективно получить исключение. По моему опыту, цель состоит в том, чтобы удостовериться, что программист проверяет на нулевые ссылки в коде - однако мы знаем, что в действительности, скучаем по некоторым. Код UI должен иметь некоторый уровень обработки исключений. Мне понравился мой ответ на тот вопрос: Мой Ответ . Что еще более важно, комментарий информация 1800 года , кто указал, что Вы просто бросаете, и не бросок исключая тем, для получения всего отслеживания стека, которое является, как Вы в конечном счете отлаживаете эти проблемы.

10
задан Artjom B. 27 November 2014 в 14:14
поделиться

4 ответа

Когда вы бросаете объект, вы фактически бросаете его копию, а не оригинал. Подумайте об этом - исходный объект находится в стеке, но стек раскручивается и становится недействительным.

Я считаю, что это часть стандарта, но у меня нет копии для ссылки.

Тип Исключение, создаваемое в блоке catch, является базовым типом catch, а не типом сгенерированного объекта. Чтобы решить эту проблему, нужно использовать throw; , а не throw e; , что вызовет исходное пойманное исключение.

21
ответ дан 3 December 2019 в 13:56
поделиться

Быстрый поиск в Google подсказывает, что да, вы создаете конструктор копирования, и он должен быть общедоступным. (Что имеет смысл, поскольку вы инициализируете копию e и бросаете ее.)

В любом случае, просто используйте throw без указания объекта исключения, чтобы повторно выбросить то, что было поймано в ловушке . Разве это не решит проблему?

  catch(Exception& e)
  {
    printf("Exception seen here! %s %d\n", __FILE__, __LINE__);
    throw;
  }
10
ответ дан 3 December 2019 в 13:56
поделиться

Да.

throw e;

генерирует исключение для типа static типа e , независимо от того, чем e на самом деле является. В этом случае исключение Derived копируется в Exception с помощью конструктора копирования.

В этом случае вы можете просто

throw;

получить Derived ] исключение всплывает правильно.

Если вас интересует полиморфный бросок в некоторых других случаях, обратитесь к всегда так полезному C ++ FAQ Lite .

7
ответ дан 3 December 2019 в 13:56
поделиться

C ++ никогда не перестает меня удивлять. Я бы потерял кучу денег, если бы делал ставку на то, каково было поведение!

Объект исключения сначала копируется во временный объект, и вы должны были использовать throw . Процитируем стандарт 15.1 / 3:

1
ответ дан 3 December 2019 в 13:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: