throw in catch
От: Hard_Club  
Дата: 28.12.11 12:41
Оценка:
Могут ли возникнуть проблемы, если выбросить исключение в catch(...){} блоке?
Re: throw in catch
От: uzhas Ниоткуда  
Дата: 28.12.11 12:47
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Могут ли возникнуть проблемы, если выбросить исключение в catch(...){} блоке?

проблемы могут быть из-за использования "throw"
catch(...) тут не при чем
Re: throw in catch
От: wander  
Дата: 28.12.11 12:48
Оценка:
Здравствуйте, Hard_Club, Вы писали:

HC> Могут ли возникнуть проблемы, если выбросить исключение в catch(...){} блоке?


Могут. Но могут и не возникнуть, если делать все правильно.
Иногда полезным бывает такой код:
try
{
   //... 
   throw std::runtime_error(""); 
   //... 
}
catch(...)
{
   releaseSomeResourcs(hRes);
   throw; // пробрасываем дальше то же исключение (std::runtime_error) 
}
avalon 1.0rc3 build 426, zlib 1.2.3
Re: throw in catch
От: rg45 СССР  
Дата: 28.12.11 12:49
Оценка: +3
Здравствуйте, Hard_Club, Вы писали:

H_C>Могут ли возникнуть проблемы, если выбросить исключение в catch(...){} блоке?


Вообще-то, это нормальная практика. А проблемы можно создать себе где угодно.
--
Re: throw in catch
От: Caracrist https://1pwd.org/
Дата: 28.12.11 13:13
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Могут ли возникнуть проблемы, если выбросить исключение в catch(...){} блоке?




void UseFunctionCallInsteadOfDefinedMacro()
{
   try
   {
      throw;
   }
   catch(const MyException&myEx)
   {
      //... 
   }
   catch(const std::exception& ex)
   {
      //... 
   }
   catch(...)
   {
      //... 
   }
}

try
{
}
catch(...)
{
   void UseFunctionCallInsteadOfDefinedMacro();
}

~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: throw in catch
От: Hard_Club  
Дата: 28.12.11 14:47
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, Hard_Club, Вы писали:


H_C>>Могут ли возникнуть проблемы, если выбросить исключение в catch(...){} блоке?




C>
C>void UseFunctionCallInsteadOfDefinedMacro()
C>{
C>   try
C>   {
C>      throw;
C>   }
C>   catch(const MyException&myEx)
C>   {
C>      //... 
C>   }
C>   catch(const std::exception& ex)
C>   {
C>      //... 
C>   }
C>   catch(...)
C>   {
C>      //... 
C>   }
C>}

C>try
C>{
C>}
C>catch(...)
C>{
C>   void UseFunctionCallInsteadOfDefinedMacro();
C>}
C>

C> :beer:

И?
Re[2]: throw in catch
От: Centaur Россия  
Дата: 28.12.11 15:30
Оценка:
Здравствуйте, wander, Вы писали:

W>Иногда полезным бывает такой код:

W>catch(...)
W>{
W>   releaseSomeResourcs(hRes);
W>   throw; // пробрасываем дальше то же исключение (std::runtime_error) 
W>}


Это для случаев, когда влом написать нормальную обёртку для ресурса, что ли?
Re[3]: throw in catch
От: wander  
Дата: 28.12.11 18:25
Оценка:
Здравствуйте, 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;
Re: throw in catch
От: Кодт Россия  
Дата: 28.12.11 19:35
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Могут ли возникнуть проблемы, если выбросить исключение в catch(...){} блоке?


Вопрос о том, можно ли выбросить новое исключение взамен того, которое в catch прилетело?
Да, можно. Старое исключение при этом будет разрушено, точно так же, как если ничего не выбрасывать. А новое вылетит за пределы try-catch и будет обработано внешней ловушкой.

Или вопрос о трюке с catch(...){try{throw;}.....} про который тут уже ответили? Тоже можно.

Проблема возможна в том случае, если исключение вылетает из самого внешнего try-блока — мысленно, вылетает за пределы main().
Если ловить исключение некому, это немедленно (прямо в момент броска) приведёт к terminate. Поэтому я и сказал "мысленно" — никакой раскрутки стека и выхода из main не произойдёт, программа сразу застрелится.
Перекуём баги на фичи!
Re[2]: throw in catch
От: Masterkent  
Дата: 28.12.11 20:04
Оценка:
Кодт:

К>Проблема возможна в том случае, если исключение вылетает из самого внешнего 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).

Re[3]: throw in catch
От: Hard_Club  
Дата: 29.12.11 07:44
Оценка:
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).


А можно ли вообще злоупотреблять исключениями. По-моему сама идея раскрутки стека таит в себе множество проблем. По-моему, лучше просто писать код, который будет исключать исключительные ситуации.
Re[4]: throw in catch
От: Hard_Club  
Дата: 29.12.11 07:45
Оценка: :)
А вот оно как
Re[4]: throw in catch
От: DarkTranquillity  
Дата: 29.12.11 08:00
Оценка: +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>А можно ли вообще злоупотреблять исключениями. По-моему сама идея раскрутки стека таит в себе множество проблем. По-моему, лучше просто писать код, который будет исключать исключительные ситуации.


Я так понял, ты решил проверить местных на терпение?

Злоупотреблять — нельзя (как впрочем любыми вещами, в т.ч. и терпением других ),
использовать — можно и нужно(если можно).
Re[5]: throw in catch
От: Hard_Club  
Дата: 29.12.11 08:28
Оценка:
DT>Злоупотреблять — нельзя (как впрочем любыми вещами, в т.ч. и терпением других ;)),
DT>использовать — можно и нужно(если можно).

При чем здесь терпение? Просто я до этого в коде исключения практически не применял (возвращал везде err-code). А тут пришел на проект, где они кидаются налево и направо.
Re[6]: throw in catch
От: Кодт Россия  
Дата: 29.12.11 08:50
Оценка: :)
Здравствуйте, Hard_Club, Вы писали:

H_C>При чем здесь терпение? Просто я до этого в коде исключения практически не применял (возвращал везде err-code). А тут пришел на проект, где они кидаются налево и направо.


Если только налево — это ещё ничего. А у меня был эпизод, когда исключения кидались и направо тоже: тупая замена кодам ошибки в условиях бешеного поллинга, то есть, отлуп не являлся исключительной ситуацией, а вполне себе рядовой. Профайлер плакал и хватался за лицо.
Перекуём баги на фичи!
Re[6]: throw in catch
От: DarkTranquillity  
Дата: 29.12.11 09:47
Оценка:
Здравствуйте, Hard_Club, Вы писали:

DT>>Злоупотреблять — нельзя (как впрочем любыми вещами, в т.ч. и терпением других ),

DT>>использовать — можно и нужно(если можно).

H_C>При чем здесь терпение?

Так если бы это была твоя единственная тема с, мягко говоря, провокационными вопросами.

H_C>Просто я до этого в коде исключения практически не применял (возвращал везде err-code). А тут пришел на проект, где они кидаются налево и направо.

Жесть.. а зачем тогда С++ используешь? Пиши на С.
Ресурсы ты как освобождал? Не врапперами, я так понимаю, а проверкой err-code и дублированием кода? А может, goto??
Re[7]: throw in catch
От: Hard_Club  
Дата: 29.12.11 10:21
Оценка:
Здравствуйте, DarkTranquillity, Вы писали:

DT>Здравствуйте, Hard_Club, Вы писали:


DT>>>Злоупотреблять — нельзя (как впрочем любыми вещами, в т.ч. и терпением других ;)),

DT>>>использовать — можно и нужно(если можно).

H_C>>При чем здесь терпение?

DT>Так если бы это была твоя единственная тема с, мягко говоря, провокационными вопросами.:)
И что здесь провокационного?

H_C>>Просто я до этого в коде исключения практически не применял (возвращал везде err-code). А тут пришел на проект, где они кидаются налево и направо.

DT>Жесть.. а зачем тогда С++ используешь? Пиши на С.
DT>Ресурсы ты как освобождал? Не врапперами, я так понимаю, а проверкой err-code и дублированием кода? А может, goto?? :crash:
В Cpp есть шаблоны. Вот ради них, а также классов, я и пишу на С++. Код я никогда не дублирую (при чем здесь это?). Ресурсы освобождаю в зависимости от ошибки в концке метода. Один раз перегрузил new для аварийного высвобоздения памяти.

При чем здесь goto?
Re[8]: throw in catch
От: DarkTranquillity  
Дата: 29.12.11 11:00
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>>>При чем здесь терпение?

DT>>Так если бы это была твоя единственная тема с, мягко говоря, провокационными вопросами.
H_C>И что здесь провокационного?
Забей, ты я смотрю настолько серьезен, что наверное сам себя в зеркале боишься.

H_C>>>Просто я до этого в коде исключения практически не применял (возвращал везде err-code). А тут пришел на проект, где они кидаются налево и направо.

DT>>Жесть.. а зачем тогда С++ используешь? Пиши на С.
DT>>Ресурсы ты как освобождал? Не врапперами, я так понимаю, а проверкой err-code и дублированием кода? А может, goto??
H_C>В Cpp есть шаблоны. Вот ради них, а также классов, я и пишу на С++. Код я никогда не дублирую (при чем здесь это?). Ресурсы освобождаю в зависимости от ошибки в концке метода. Один раз перегрузил new для аварийного высвобоздения памяти.

H_C>При чем здесь goto?


Твоя схема освобождения "в конце метода" как реализовывается обычно?
Объявление всех переменных с инициализацией ошибочным значением в начале функции, глубоко вложенные if-ы, и освобождение (если не ошибочное значение) в конце?
Re[9]: throw in catch
От: Hard_Club  
Дата: 29.12.11 12:20
Оценка:
DT>Забей, ты я смотрю настолько серьезен, что наверное сам себя в зеркале боишься.
Да все там, в зеркале, в порядке.

DT>Твоя схема освобождения "в конце метода" как реализовывается обычно?

DT>Объявление всех переменных с инициализацией ошибочным значением в начале функции, глубоко вложенные if-ы, и освобождение (если не ошибочное значение) в конце?

Ошибочным или значением по умолчанию — зависит от случая. Гложенные if-ы я обхожу с помощью будевых переменных. Да, освобождение в конце или smart_prt.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.