Для ссылки, подобного потока: я должен поймать исключения только для входа их?
Угловые точки - то, что Вы хотите эффективно получить исключение. По моему опыту, цель состоит в том, чтобы удостовериться, что программист проверяет на нулевые ссылки в коде - однако мы знаем, что в действительности, скучаем по некоторым. Код UI должен иметь некоторый уровень обработки исключений. Мне понравился мой ответ на тот вопрос: Мой Ответ . Что еще более важно, комментарий информация 1800 года , кто указал, что Вы просто бросаете, и не бросок исключая тем, для получения всего отслеживания стека, которое является, как Вы в конечном счете отлаживаете эти проблемы.
Когда вы бросаете объект, вы фактически бросаете его копию, а не оригинал. Подумайте об этом - исходный объект находится в стеке, но стек раскручивается и становится недействительным.
Я считаю, что это часть стандарта, но у меня нет копии для ссылки.
Тип Исключение, создаваемое в блоке catch, является базовым типом catch, а не типом сгенерированного объекта. Чтобы решить эту проблему, нужно использовать throw;
, а не throw e;
, что вызовет исходное пойманное исключение.
Быстрый поиск в Google подсказывает, что да, вы создаете конструктор копирования, и он должен быть общедоступным. (Что имеет смысл, поскольку вы инициализируете копию e
и бросаете ее.)
В любом случае, просто используйте throw
без указания объекта исключения, чтобы повторно выбросить то, что было поймано в ловушке
. Разве это не решит проблему?
catch(Exception& e)
{
printf("Exception seen here! %s %d\n", __FILE__, __LINE__);
throw;
}
Да.
throw e;
генерирует исключение для типа static типа e
, независимо от того, чем e
на самом деле является. В этом случае исключение Derived
копируется в Exception
с помощью конструктора копирования.
В этом случае вы можете просто
throw;
получить Derived
] исключение всплывает правильно.
Если вас интересует полиморфный бросок в некоторых других случаях, обратитесь к всегда так полезному C ++ FAQ Lite .
C ++ никогда не перестает меня удивлять. Я бы потерял кучу денег, если бы делал ставку на то, каково было поведение!
Объект исключения сначала копируется во временный объект, и вы должны были использовать throw
. Процитируем стандарт 15.1 / 3: