Автор
|
Тема: Перехват всех исключений?
|
m_fox |
опубликован 17-08-2001 18:32 MSK
Как перехватить все исключения? Блок try catch(...) правильно работает только в отладочной версии. А в release отлавливает только исключения сгенерированые throw. Есть еще __try __except(), но этот блок имеет ограничения на использование. например при коде int *p=0; *p=5; в release версии windows отстрелит приложение.
|
server_mouse
|
опубликован 17-08-2001 18:51 MSK
Не знаю, у меня try {byte* t=0; *t=5;} catch(...){ MessageBox("EXCEPTION","EXCEPTION",MB_OK);}работает на ура. |
m_fox
|
опубликован 17-08-2001 19:00 MSK
Сделай RELEASE компоновку в VC6 не отлавливается |
server_mouse
|
опубликован 17-08-2001 19:12 MSK
Не волнуйся, я внимательно прочитал твою месагу. Сообщение выводится в ОБОИХ версиях!Может я чё не так делаю? Создаю новый проект на диалоге и прям в OnInitDialog() вставляю код. Далее, Build->Set Active Configuration->Win32Release. Запускаю и имею сообщение. Нажимаю ОК и всё пахает дальше. |
server_mouse
|
опубликован 17-08-2001 19:14 MSK
PS VC 6.0 Standart Edition |
m_fox
|
опубликован 18-08-2001 17:31 MSK
Странно, у меня VC6 enterprise и вот такая лабуда. На четырех разных компах и на разных OC. |
migel
|
опубликован 19-08-2001 21:36 MSK
Насчет __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
Да, я знаю этот блок, он работает на все исключения, но он имеет ряд ограничений. Этот блок нельзя использовать в деструкторах и нельзя чтобы в блоке создавались объекты. |
migel
|
опубликован 20-08-2001 15:53 MSK
Откуда такая инфа, что нельзазаводить переменные и нельзя использовать в деструкторах??? в МС написано что нельзя делать goto в __try{}__except() блок. |
m_fox
|
опубликован 20-08-2001 16:29 MSK
Я же пробовал заменить все блоки try{}catch(...){} на __try except() :) Компилятор ругался во многих местах. |
sps
|
опубликован 20-08-2001 17:52 MSK
Попробуй посмотреть опцию 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
Спасибо, отключение этой опции действительно помогло решить проблему. Правда выдается предупреждение: Compiler Warning (level 1) C4530 C++ exception handler used, but unwind semantics are not enabled. Specify -GXC++ 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
ObjC не уничтожиться. |
sps
|
опубликован 21-08-2001 16:11 MSK
>migel Я уверен, что объект C класса Obj вообще не создастся в той ситуации, какую описал m_fox. >m_fox Я думаю, что приложение будет работать корректно. |
m_fox
|
опубликован 22-08-2001 10:50 MSK
Я проверил: объект A уничтожится, B не уничтожится, С не создастся. |
migel
|
опубликован 22-08-2001 15:03 MSK
Только хотел добавить, .... и не создаться вообще... как коннект тогось - упал,.. такие дела - извиняюсь за возможные недоразумения |