Здравствуйте, Hard_Club, Вы писали:
H_C>Могут ли возникнуть проблемы, если выбросить исключение в catch(...){} блоке?
проблемы могут быть из-за использования "throw"
catch(...) тут не при чем
Здравствуйте, Caracrist, Вы писали:
C>Здравствуйте, Hard_Club, Вы писали:
H_C>>Могут ли возникнуть проблемы, если выбросить исключение в catch(...){} блоке?
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, wander, Вы писали:
W>>Иногда полезным бывает такой код: C>
W>>catch(...)
W>>{
W>> releaseSomeResourcs(hRes);
W>> throw; // пробрасываем дальше то же исключение (std::runtime_error)
W>>}
C>
C>Это для случаев, когда влом написать нормальную обёртку для ресурса, что ли?
Нет, это для другого случая.
Для случая, когда ресурс нельзя освобождать в деструкторе этой самой обертки, потому что есть еще сценарии использования при некоторых ошибках, или не нужно освобождать его в нормальной ситуации, когда нет исключения, но происходит выход из scope.
Псевдокод основан на реальных событиях.
Resource * res = resourceHolder->addResource(someData); // реально ресурсом владеет resourceHolder
//...try
{
//...
res->configure(someConfData);
//...
}
catch(some_error1 & e) // произошла некая ошибка, но мы можем продожать работу
{
res->checkAndFix(someRestoreData);
}
catch(...) // все остальные ошибки критические
{
resourceHolder->remove(res);
throw;
}
//...return res;
Здравствуйте, Hard_Club, Вы писали:
H_C>Могут ли возникнуть проблемы, если выбросить исключение в catch(...){} блоке?
Вопрос о том, можно ли выбросить новое исключение взамен того, которое в catch прилетело?
Да, можно. Старое исключение при этом будет разрушено, точно так же, как если ничего не выбрасывать. А новое вылетит за пределы try-catch и будет обработано внешней ловушкой.
Или вопрос о трюке с catch(...){try{throw;}.....} про который тут уже ответили? Тоже можно.
Проблема возможна в том случае, если исключение вылетает из самого внешнего try-блока — мысленно, вылетает за пределы main().
Если ловить исключение некому, это немедленно (прямо в момент броска) приведёт к terminate. Поэтому я и сказал "мысленно" — никакой раскрутки стека и выхода из main не произойдёт, программа сразу застрелится.
Кодт:
К>Проблема возможна в том случае, если исключение вылетает из самого внешнего try-блока — мысленно, вылетает за пределы main(). К>Если ловить исключение некому, это немедленно (прямо в момент броска) приведёт к terminate. Поэтому я и сказал "мысленно" — никакой раскрутки стека и выхода из main не произойдёт, программа сразу застрелится.
15.3/9:
If no matching handler is found, the function std::terminate() is called; whether or not the stack is unwound before this call to std::terminate() is implementation-defined (15.5.1).
If no matching handler is found, the function std::terminate() is called; whether or not the stack is unwound before this call to std::terminate() is implementation-defined (15.5.1).
А можно ли вообще злоупотреблять исключениями. По-моему сама идея раскрутки стека таит в себе множество проблем. По-моему, лучше просто писать код, который будет исключать исключительные ситуации.
Здравствуйте, Hard_Club, Вы писали:
M>>15.3/9: M>>
If no matching handler is found, the function std::terminate() is called; whether or not the stack is unwound before this call to std::terminate() is implementation-defined (15.5.1).
H_C>А можно ли вообще злоупотреблять исключениями. По-моему сама идея раскрутки стека таит в себе множество проблем. По-моему, лучше просто писать код, который будет исключать исключительные ситуации.
Я так понял, ты решил проверить местных на терпение?
Злоупотреблять — нельзя (как впрочем любыми вещами, в т.ч. и терпением других ),
использовать — можно и нужно(если можно).
DT>Злоупотреблять — нельзя (как впрочем любыми вещами, в т.ч. и терпением других ;)), DT>использовать — можно и нужно(если можно).
При чем здесь терпение? Просто я до этого в коде исключения практически не применял (возвращал везде err-code). А тут пришел на проект, где они кидаются налево и направо.
Здравствуйте, Hard_Club, Вы писали:
H_C>При чем здесь терпение? Просто я до этого в коде исключения практически не применял (возвращал везде err-code). А тут пришел на проект, где они кидаются налево и направо.
Если только налево — это ещё ничего. А у меня был эпизод, когда исключения кидались и направо тоже: тупая замена кодам ошибки в условиях бешеного поллинга, то есть, отлуп не являлся исключительной ситуацией, а вполне себе рядовой. Профайлер плакал и хватался за лицо.
Здравствуйте, Hard_Club, Вы писали:
DT>>Злоупотреблять — нельзя (как впрочем любыми вещами, в т.ч. и терпением других ), DT>>использовать — можно и нужно(если можно).
H_C>При чем здесь терпение?
Так если бы это была твоя единственная тема с, мягко говоря, провокационными вопросами.
H_C>Просто я до этого в коде исключения практически не применял (возвращал везде err-code). А тут пришел на проект, где они кидаются налево и направо.
Жесть.. а зачем тогда С++ используешь? Пиши на С.
Ресурсы ты как освобождал? Не врапперами, я так понимаю, а проверкой err-code и дублированием кода? А может, goto??
Здравствуйте, DarkTranquillity, Вы писали:
DT>Здравствуйте, Hard_Club, Вы писали:
DT>>>Злоупотреблять — нельзя (как впрочем любыми вещами, в т.ч. и терпением других ;)), DT>>>использовать — можно и нужно(если можно).
H_C>>При чем здесь терпение? DT>Так если бы это была твоя единственная тема с, мягко говоря, провокационными вопросами.:)
И что здесь провокационного?
H_C>>Просто я до этого в коде исключения практически не применял (возвращал везде err-code). А тут пришел на проект, где они кидаются налево и направо. DT>Жесть.. а зачем тогда С++ используешь? Пиши на С. DT>Ресурсы ты как освобождал? Не врапперами, я так понимаю, а проверкой err-code и дублированием кода? А может, goto?? :crash:
В Cpp есть шаблоны. Вот ради них, а также классов, я и пишу на С++. Код я никогда не дублирую (при чем здесь это?). Ресурсы освобождаю в зависимости от ошибки в концке метода. Один раз перегрузил new для аварийного высвобоздения памяти.
Здравствуйте, Hard_Club, Вы писали:
H_C>>>При чем здесь терпение? DT>>Так если бы это была твоя единственная тема с, мягко говоря, провокационными вопросами. H_C>И что здесь провокационного?
Забей, ты я смотрю настолько серьезен, что наверное сам себя в зеркале боишься.
H_C>>>Просто я до этого в коде исключения практически не применял (возвращал везде err-code). А тут пришел на проект, где они кидаются налево и направо. DT>>Жесть.. а зачем тогда С++ используешь? Пиши на С. DT>>Ресурсы ты как освобождал? Не врапперами, я так понимаю, а проверкой err-code и дублированием кода? А может, goto?? H_C>В Cpp есть шаблоны. Вот ради них, а также классов, я и пишу на С++. Код я никогда не дублирую (при чем здесь это?). Ресурсы освобождаю в зависимости от ошибки в концке метода. Один раз перегрузил new для аварийного высвобоздения памяти.
H_C>При чем здесь goto?
Твоя схема освобождения "в конце метода" как реализовывается обычно?
Объявление всех переменных с инициализацией ошибочным значением в начале функции, глубоко вложенные if-ы, и освобождение (если не ошибочное значение) в конце?
DT>Забей, ты я смотрю настолько серьезен, что наверное сам себя в зеркале боишься.
Да все там, в зеркале, в порядке.
DT>Твоя схема освобождения "в конце метода" как реализовывается обычно? DT>Объявление всех переменных с инициализацией ошибочным значением в начале функции, глубоко вложенные if-ы, и освобождение (если не ошибочное значение) в конце?
Ошибочным или значением по умолчанию — зависит от случая. Гложенные if-ы я обхожу с помощью будевых переменных. Да, освобождение в конце или smart_prt.