Другие языки программирования и технологии

C++ обработка исключений: throw без параметров

Предположим, есть код:
try

{

//some actions

}

catch( exception& e )

{

//other actions

throw;

}

Т. е. мы ловим исключение, пытаемся что-либо сделать и если ничего не получается - кидаем исключение дальше (выше по стеку) .

Внимание, вопрос:

почему нужно писать именно так (throw;), а не throw e; ?
Думаю, что причин, как минимум, несколько, но самая важная всего одна:

- если почитаете умную книжку по исключениям, то поймете, что бросать исключение из catch иногда действительно нужно, но делать это целесообразно намного реже, чем думает начинающий программист. Все случаи бросания исключения из catch вписывается в несколько стандартных "паттернов" программирования. Я вот осознал, что брсаю из catch всего в двух случаях: либо ловлю три точки (и тогда из catch(...) вызываю ф-цию типа HandleException(), а в ней внутри уже делаю try, в нем through без параметров и разгребаю exception-ы по типам, но без дальнейшей переброски наружу) ; либо делаю трансляцию исключений, но это происходит намного реже.

Трансляция исключений - это когда Вы ловите одно, а бросаете дальше другое. Это отдельная продвинутая тема для разговора.

Другие случаи, когда было бы целесообразно бросать из catch, в голову не приходят. Бывают еще try..catch function blocks (используются когда при конструировании объекта летит исключение во время конструирования родителей или членов класса - такие исключения можно обработать, но Вы их обязаны кинуть дальше) . Но этот try..catch блок концептуально больно сильно похож на трансляцию исключений.
Елдар Сагымбек
Елдар Сагымбек
19 662
Лучший ответ
Елдар Сагымбек Если кратко по стилю, то в хорошем коде мало всего делается в обработчиках исключений, вместо этого преимущественно испольузются деструкторы/умные указатели на разные ресурсы.
Владимир Жирков-Вензель проблема вот в чем: был я на собеседовании. задали вопрос - что кинет throw; - ответил. потом спросили: почему вместоcatch( exception &e ) { throw e; }
необходимо писать именно
catch( exception& e ) { throw; }
т. е. мы знаем, что поймали (не catch(...))
вот на это, собственно, не ответил и инфу найти не смог
Потому что мы могли ловить что угодно:
catch(...)
{
std::cout<<"что-то не так! "<<std::endl;
throw;//мы не знаем, что поймали, но на всякий случай кидаем назад
}
Владимир Жирков-Вензель проблема вот в чем: был я на собеседовании. задали вопрос - что кинет throw; - ответил. потом спросили: почему вместо
catch( exception &e ) { throw e; }

необходимо писать именно

catch( exception& e ) { throw; }

т. е. мы знаем, что поймали (не catch(...))

вот на это, собственно, не ответил и инфу найти не смог
Синтаксис такой по принципу "чем меньше писать - тем лучше".
Владимир Жирков-Вензель не думаю. мне на днях сказали: вариант " throw e;" не сработает.
Пиши на форумы программистов, думаю тут таковых не много.
Владимир Жирков-Вензель Да есть тут пара человек.. . Но спят еще, наверное =)