WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Перехват всех исключений?

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Перехват всех исключений?
m_fox опубликован 17-08-2001 18:32 MSK   Click Here to See the Profile for m_fox   Click Here to Email m_fox  
Как перехватить все исключения?
Блок try catch(...) правильно работает только в отладочной версии. А в release отлавливает только исключения сгенерированые throw.
Есть еще __try __except(), но этот блок имеет ограничения на использование.
например при коде int *p=0; *p=5; в release версии windows отстрелит приложение.
server_mouse опубликован 17-08-2001 18:51 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Не знаю, у меня
try {byte* t=0; *t=5;}
catch(...){
MessageBox("EXCEPTION","EXCEPTION",MB_OK);}

работает на ура.

m_fox опубликован 17-08-2001 19:00 MSK     Click Here to See the Profile for m_fox  Click Here to Email m_fox     
Сделай RELEASE компоновку
в VC6 не отлавливается
server_mouse опубликован 17-08-2001 19:12 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Не волнуйся, я внимательно прочитал твою месагу. Сообщение выводится в ОБОИХ версиях!

Может я чё не так делаю?
Создаю новый проект на диалоге и прям в OnInitDialog() вставляю код. Далее, Build->Set Active Configuration->Win32Release.
Запускаю и имею сообщение. Нажимаю ОК и всё пахает дальше.

server_mouse опубликован 17-08-2001 19:14 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
PS VC 6.0 Standart Edition
m_fox опубликован 18-08-2001 17:31 MSK     Click Here to See the Profile for m_fox  Click Here to Email m_fox     
Странно, у меня VC6 enterprise и вот такая лабуда.
На четырех разных компах и на разных OC.
migel опубликован 19-08-2001 21:36 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Насчет __try __catch Винды определяют "отстрелить" ли приложение по коду возврата фильтра исключения
попробуй пример:
main ()
{
int Eval_Exception( void );

__try {
int*p = 0;
*p = 5;
...
}
__except ( Eval_Exception( GetExceptionCode( ))) {
// No code; this block never executed.
}
...
}

int Eval_Exception ( int n_except )
{
if ( n_except != STATUS_ACCES_VIOLATION &&
n_except != STATUS_FLOATING_OVERFLOW ) // Pass on most
return EXCEPTION_CONTINUE_SEARCH; // exceptions

return EXCEPTION_CONTINUE_EXECUTION;
}

m_fox опубликован 20-08-2001 03:11 MSK     Click Here to See the Profile for m_fox  Click Here to Email m_fox     
Да, я знаю этот блок, он работает на все исключения, но он имеет ряд ограничений. Этот блок нельзя использовать в деструкторах и нельзя чтобы в блоке создавались объекты.
migel опубликован 20-08-2001 15:53 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Откуда такая инфа, что нельзазаводить переменные и нельзя использовать в деструкторах???
в МС написано что нельзя делать goto в __try{}__except() блок.
m_fox опубликован 20-08-2001 16:29 MSK     Click Here to See the Profile for m_fox  Click Here to Email m_fox     
Я же пробовал заменить все блоки try{}catch(...){} на __try except() :)
Компилятор ругался во многих местах.
sps опубликован 20-08-2001 17:52 MSK     Click Here to See the Profile for sps  Click Here to Email sps     
Попробуй посмотреть опцию MS VC++ компилятора:
Project Settings\C/C++\C++ Language\Enable Exception Handling.
Я ее отключил в Release версии и все заработало (с включенной выдавала GPF). Для проверки использовал:
void main()
{
try
{
int *pi = NULL;
*pi = 5;
}
catch(...)
{
::MessageBox(NULL, "", "", MB_OK);
}
}
m_fox опубликован 20-08-2001 18:20 MSK     Click Here to See the Profile for m_fox  Click Here to Email m_fox     
Спасибо, отключение этой опции действительно помогло решить проблему. Правда выдается предупреждение:
Compiler Warning (level 1) C4530
C++ exception handler used, but unwind semantics are not enabled. Specify -GX

C++ exception handling was used but the Enable Exception Handling (/GX) option was not selected.

When the /GX option has not been enabled, an object with automatic storage in the frame between the function doing the throw and the function catching the throw will not be destroyed. However, an object with automatic storage created in a try or catch block will be destroyed.
И вот тут я не совсем понял. Каие из объектов не будут уничтожены:
void func()
{
Obj A;
try
{
Obj B;
... // выработалось исключение
Obj C;
}catch()
{
}
}
Какие из объектов не будут уничтожены?
Впринципе меня этот вопрос волнует чисто из спортивного интереса.

migel опубликован 20-08-2001 21:22 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
ObjC не уничтожиться.
sps опубликован 21-08-2001 16:11 MSK     Click Here to See the Profile for sps  Click Here to Email sps     
>migel
Я уверен, что объект C класса Obj вообще не создастся в той ситуации, какую описал m_fox.
>m_fox
Я думаю, что приложение будет работать корректно.
m_fox опубликован 22-08-2001 10:50 MSK     Click Here to See the Profile for m_fox  Click Here to Email m_fox     
Я проверил: объект A уничтожится, B не уничтожится, С не создастся.
migel опубликован 22-08-2001 15:03 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Только хотел добавить, .... и не создаться вообще... как коннект тогось - упал,.. такие дела - извиняюсь за возможные недоразумения

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.