2015-07-17 1 views
4

Во время чтения «Более Исключительные C++» по Hurb Саттер, я наткнулся на следующий код:Try Поймайте блок в деструкторе

// Example 19-5: Alternative right solution 
// 
T::Close() 
{ 
    // ... code that could throw ... 
} 

T::~T() /* throw() */ 
{ 
    try 
    { 
    Close(); 
    } 
    catch(...) { } 
} 

Мое понимание было, это не очень хорошая идея. Потому что, если T destructor вызывается во время разворачивания стека из-за исключения, а затем Close() выдает исключение, то это вызовет вызов Terminate().

Может кто-то пролить свет на это. Заранее спасибо.

+0

Вы должны избежать деструктора, который может вызвать исключение, это нормально, чтобы поймать и управлять ими должным образом. –

+1

Возможно, вы захотите прочитать [N4152] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4152.pdf), «исключенные исключения», проголосовали за C++ 17 , –

ответ

7

Мое понимание было, это не очень хорошая идея. Потому что, если T destructor вызывается во время разворачивания стека из-за исключения, а затем Close() выдает исключение, то это вызовет вызов Terminate().

try - catch блок есть, чтобы предотвратить это. Код:

try 
{ 
    Close(); 
} 
catch(...) { } 

поймает любое исключение, брошенную Close и игнорировать их. Поэтому деструктор не будет вызвать любое исключение, которое может привести к выходу функции завершения.

+1

Я думаю, что ОП задает вопрос, подходит ли для 'Close()' исключение, тогда как другое исключение уже активно. –

6

Не имеет значения, может ли Close выбросить, если catch не позволяет исключить исключение.

Как правило, статья catch предназначена для того, чтобы никогда не бросать.

Фактически, отсутствие предложения catch приведет к проблеме, которую вы описываете.

 Смежные вопросы

  • Нет связанных вопросов^_^