Предположим, есть код:
try
{
//some actions
}
catch( exception& e )
{
//other actions
throw;
}
Т. е. мы ловим исключение, пытаемся что-либо сделать и если ничего не получается - кидаем исключение дальше (выше по стеку) .
Внимание, вопрос:
почему нужно писать именно так (throw;), а не throw e; ?
Другие языки программирования и технологии
C++ обработка исключений: throw без параметров
Думаю, что причин, как минимум, несколько, но самая важная всего одна:
- если почитаете умную книжку по исключениям, то поймете, что бросать исключение из catch иногда действительно нужно, но делать это целесообразно намного реже, чем думает начинающий программист. Все случаи бросания исключения из catch вписывается в несколько стандартных "паттернов" программирования. Я вот осознал, что брсаю из catch всего в двух случаях: либо ловлю три точки (и тогда из catch(...) вызываю ф-цию типа HandleException(), а в ней внутри уже делаю try, в нем through без параметров и разгребаю exception-ы по типам, но без дальнейшей переброски наружу) ; либо делаю трансляцию исключений, но это происходит намного реже.
Трансляция исключений - это когда Вы ловите одно, а бросаете дальше другое. Это отдельная продвинутая тема для разговора.
Другие случаи, когда было бы целесообразно бросать из catch, в голову не приходят. Бывают еще try..catch function blocks (используются когда при конструировании объекта летит исключение во время конструирования родителей или членов класса - такие исключения можно обработать, но Вы их обязаны кинуть дальше) . Но этот try..catch блок концептуально больно сильно похож на трансляцию исключений.
- если почитаете умную книжку по исключениям, то поймете, что бросать исключение из catch иногда действительно нужно, но делать это целесообразно намного реже, чем думает начинающий программист. Все случаи бросания исключения из catch вписывается в несколько стандартных "паттернов" программирования. Я вот осознал, что брсаю из catch всего в двух случаях: либо ловлю три точки (и тогда из catch(...) вызываю ф-цию типа HandleException(), а в ней внутри уже делаю try, в нем through без параметров и разгребаю exception-ы по типам, но без дальнейшей переброски наружу) ; либо делаю трансляцию исключений, но это происходит намного реже.
Трансляция исключений - это когда Вы ловите одно, а бросаете дальше другое. Это отдельная продвинутая тема для разговора.
Другие случаи, когда было бы целесообразно бросать из catch, в голову не приходят. Бывают еще try..catch function blocks (используются когда при конструировании объекта летит исключение во время конструирования родителей или членов класса - такие исключения можно обработать, но Вы их обязаны кинуть дальше) . Но этот try..catch блок концептуально больно сильно похож на трансляцию исключений.
Потому что мы могли ловить что угодно:
catch(...)
{
std::cout<<"что-то не так! "<<std::endl;
throw;//мы не знаем, что поймали, но на всякий случай кидаем назад
}
catch(...)
{
std::cout<<"что-то не так! "<<std::endl;
throw;//мы не знаем, что поймали, но на всякий случай кидаем назад
}
Владимир Жирков-Вензель
проблема вот в чем: был я на собеседовании. задали вопрос - что кинет throw; - ответил. потом спросили: почему вместо
catch( exception &e ) { throw e; }
необходимо писать именно
catch( exception& e ) { throw; }
т. е. мы знаем, что поймали (не catch(...))
вот на это, собственно, не ответил и инфу найти не смог
catch( exception &e ) { throw e; }
необходимо писать именно
catch( exception& e ) { throw; }
т. е. мы знаем, что поймали (не catch(...))
вот на это, собственно, не ответил и инфу найти не смог
Синтаксис такой по принципу "чем меньше писать - тем лучше".
Владимир Жирков-Вензель
не думаю. мне на днях сказали: вариант " throw e;" не сработает.
Пиши на форумы программистов, думаю тут таковых не много.
Владимир Жирков-Вензель
Да есть тут пара человек.. . Но спят еще, наверное =)
Похожие вопросы
- Обработку исключений throw catch
- Как передать функцию в качестве параметра другой функции на C++?
- Вопрос насчет объявления и параметра функции в C++
- C++ алгоритм, обработки данных. Как идет обработка?
- Исключения C++
- C передать строку 1 параметра в массив
- Обработка исключительных ситуаций. Как правильно использовать? Как она применяется на практике в реальных программах?
- Помогите Задан массив Р(N).Переписать все его элементы,за исключением максимального и минимального в массив D.(язык C++)
- C# Как сформулировать понятие "дробь"(число с количеством после запятой) и добавить его в исключение?
- Учусь програмировать на C++ по книге "C++ для чайников".Проблема.
необходимо писать именно
catch( exception& e ) { throw; }
т. е. мы знаем, что поймали (не catch(...))
вот на это, собственно, не ответил и инфу найти не смог