Это не ясно написано в предыдущих ответах, поэтому:
Исключения случаются в C ++
Использование STL или нет не приведет к удалению кода RAII, который освободит выделенные вами ресурсы объектов.
Например:
void doSomething()
{
MyString str ;
doSomethingElse() ;
}
В приведенном выше коде компилятор сгенерирует код для освобождения ресурсов MyString (то есть вызовет деструктор MyString), независимо от того, что происходит в это время, в том числе, если исключение выдается doSomethingElse или если вы делаете " возврат "до конца области действия функции.
Если у вас есть проблемы с этим, то либо вы должны пересмотреть свое мышление, либо попробовать C.
Исключения должны быть исключительными
Обычно, когда возникает исключение ( и только тогда, когда ), производительность снижается.
Но тогда исключение следует отправлять только когда:
- У вас есть исключительное событие для обработки (т. Е. Какая-то ошибка)
- В очень исключительных случаях (т. Е. "Массивный возврат" от многократного вызова функции в стеке, например, при выполнении сложного поиска или разматывании стека до изящного прерывания потока)
Ключевое слово здесь «исключительное», что хорошо, потому что мы обсуждаем «исключение» (см. Образец?).
В вашем случае, если у вас возникло исключение, велика вероятность, что что-то настолько плохое случится, что ваша программа все равно рухнула бы без исключения.
В этом случае ваша проблема не связана с падением производительности. Он предназначен для корректной обработки ошибки или, что еще хуже, для корректного завершения вашей программы (включая окно сообщения «Извините», сохранение несохраненных данных во временный файл для последующего восстановления и т. Д.).
Это означает (если не в очень исключительных случаях), не используйте исключения в качестве «возвращаемых данных». Бросайте исключения, когда случается что-то очень плохое. Поймайте исключение, только если вы знаете, что с этим делать. Избегайте попытки / отлова (если вы не знаете, как обрабатывать исключение).
А как насчет STL?
Теперь, когда мы знаем, что:
- Вы все еще хотите использовать C ++
- Ваша цель - не создавать тысячи исключений каждую секунду, просто для удовольствия
Мы должны обсудить STL:
STL будет (если возможно) обычно проверять, что с ним что-то не так. И если вы это сделаете, он бросит исключение. Тем не менее, в C ++ вы обычно не будете платить за то, что не будете использовать.
Примером этого является доступ к векторным данным.
Если вы знаете , вы не выйдете за пределы, тогда вам следует использовать оператор [].
Если вы знаете , вы не будете проверять границы, тогда вам следует использовать метод at ().
Пример A:
typedef std::vector<std::string> Vector ;
void outputAllData(const Vector & aString)
{
for(Vector::size_type i = 0, iMax = aString.size() ; i != iMax ; ++i)
{
std::cout << i << " : " << aString[i] << std::endl ;
}
}
Пример Б:
typedef std::vector<std::string> Vector ;
void outputSomeData(const Vector & aString, Vector::size_type iIndex)
{
std::cout << iIndex << " : " << aString.at(iIndex) << std::endl ;
}
Пример «доверяет» программисту, и при проверке не теряется время (и, таким образом, уменьшается вероятность возникновения исключения в это время в случае ошибки в любом случае ... Что обычно означает, что после этого обычно происходит ошибка / исключение / сбой, что не помогает при отладке и позволяет повредить больше данных).
В примере B запрашивается вектор для проверки правильности индекса и, если нет, выдается исключение.
Выбор за вами.