Фильтр для exception-ов
От: Dobre  
Дата: 08.12.05 18:23
Оценка:
Привет всем.
Вот тут
Автор: 0xDEADBEEF
Дата: 05.10.05
0xDEADBEE описал один подход к обработке exception-ов.

Я попробовал и нарвался на проблему:
Приветствую.

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


void TheFunction()
{
    try 
    {
        // предположим у нас тут зовется что-то вроде
        ....
        throw Exception1();
    }
    catch(...) 
    {
        ExceptionFilter();
    }                             // ВОТ ТУТ ВЫЗОВЕТСЯ ДЕСТРУКТОР ВТОРОЙ РАЗ

}

void ExceptionFilter()
{
    try 
    {
        throw;
    } 
    catch(Exception1 const& e) 
    {
        //делаем одно
    }                             // ВОТ ТУТ ВЫЗОВЕТСЯ ДЕСТРУКТОР ПЕРВЫЙ РАЗ
    catch(Exception2 const& e) 
    {
        //делаем второе
    } 
    catch(Exception3 const& e) 
    {
        //делаем третье
    } 
    catch(Exception4 const& e) 
    {
        //делаем четвертое
    } 
    catch(Exception5 const& e) 
    {
        //делаем пятое
    } 
    catch(...) 
    {
        //делаем еще что-то
    }
}




А вот теперь представим, что я пытаюсь отловить exception который определен в какой то сторонней библиотеке. И определен так, что как только мы ему зовем деструктор второй раз, так он тотчаз стреляет мой программе прямо в висок (что если у него в деструкторе стоит: delete pSomePtr

Как жить ? Как быть ? Или может я что то не так сделал ?
Re: Фильтр для exception-ов
От: crable США  
Дата: 08.12.05 18:41
Оценка:
Здравствуйте, Dobre, Вы писали:

D>Привет всем.

D>Вот тут
Автор: 0xDEADBEEF
Дата: 05.10.05
0xDEADBEE описал один подход к обработке exception-ов.


D>Я попробовал и нарвался на проблему:

D>Приветствую.

D>Вот пытаюсь Ваш чудо способ применить у себя, но заметил одну небольшую непонятную ситуацию у себя. Может Вы проясните мне, как действовать в данной ситуации. Такое ощущение, что деструктор класса-исключения будет кидаться несколько раз:


[snip]

D>А вот теперь представим, что я пытаюсь отловить exception который определен в какой то сторонней библиотеке. И определен так, что как только мы ему зовем деструктор второй раз, так он тотчаз стреляет мой программе прямо в висок (что если у него в деструкторе стоит: delete pSomePtr


D>Как жить ? Как быть ? Или может я что то не так сделал ?


А ты уверен, что он не один раз вызывается? Может ты конструктор копии не учел? Приведи код, в котором это происходит, тогда можно будет сказать что-либо определенное.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re[2]: Фильтр для exception-ов
От: Dobre  
Дата: 09.12.05 07:47
Оценка:
Здравствуйте, crable, Вы писали:

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


D>>Привет всем.

D>>Вот тут
Автор: 0xDEADBEEF
Дата: 05.10.05
0xDEADBEE описал один подход к обработке exception-ов.


D>>Я попробовал и нарвался на проблему:

D>>Приветствую.

D>>Вот пытаюсь Ваш чудо способ применить у себя, но заметил одну небольшую непонятную ситуацию у себя. Может Вы проясните мне, как действовать в данной ситуации. Такое ощущение, что деструктор класса-исключения будет кидаться несколько раз:


C>[snip]


D>>А вот теперь представим, что я пытаюсь отловить exception который определен в какой то сторонней библиотеке. И определен так, что как только мы ему зовем деструктор второй раз, так он тотчаз стреляет мой программе прямо в висок (что если у него в деструкторе стоит: delete pSomePtr


D>>Как жить ? Как быть ? Или может я что то не так сделал ?


C>А ты уверен, что он не один раз вызывается? Может ты конструктор копии не учел? Приведи код, в котором это происходит, тогда можно будет сказать что-либо определенное.


Приветствую, да все я учел. Деструктор и вправду вызывается 2 раза. Как ответил Кодт в другой ветке — это баг VC6.0, VC7.0
На VC7.1 все работает нормально.

И что же получается ? Такой черезвычайно удобной фичей нельзя пользоваться в VC6.0 ???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.