powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исключения в релизе не обрабатываются
7 сообщений из 7, страница 1 из 1
Исключения в релизе не обрабатываются
    #34240171
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

MSVC6SP5 проект Win32 Console
Разбирался с работой исключений - наткнулся на один интересный момент:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	char* ptr = NULL;
	try	{
		*ptr =  1 ;
		printf("TRY\n");
	}
	catch(...)	{
		printf("EXCEPT\n");
	}
При сборке debug версии - все нормально, исключения обрабатываются. Собираю release - исключения не обрабатываются пишет программа выполнила недопустимую операцию.
Нашел разницу в параметрах компилятора: в релизе меняется ключик /Od (без оптимизации) на /O2 (Maximize Speed). Ставишь в релизе /Od - начинает обрабатывать.
MSDNTo enable C++ exception handling in your code, use /GX. /GX есть.
Или MS решили что Maximize Speed можно получить за счет пропуска обработки исключений? Minimize Size, кстати, тот же эффект.

Кто-нибудь с этим уже сталкивался? Или такое только у меня?
Кто хочет сам попробовать: создать новый проект "Win32 Console", тип "Hello world" и в main() вставить этот код.

PS замена на __try ... __except проблему решает, но как понимаю в этом случае могут иногда некорректно деструкторы отработать, а иногда вообще не компилируется - ругается на использование объектов классов с деструктором.
...
Рейтинг: 0 / 0
Исключения в релизе не обрабатываются
    #34241954
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не сталкивался? У кого VC6 попробуйте, может только у меня так происходит?

И второе, можно как-то в препроцессоре тип оптимизации компилятора проверить? Чтобы при компиляции сообщение было, что-то типа:
Код: plaintext
1.
2.
3.
#if(оптимизация включена)
#pragma message ("Отключите оптимизацию или забудьте про обработку исключений")
#endif
...
Рейтинг: 0 / 0
Исключения в релизе не обрабатываются
    #34251903
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня подтвердилось!


Покопался и вроде нашёл причину:

Код: plaintext
1.
With the new synchronous exception model, now the default, exceptions can be thrown only with a throw statement.
Therefore, the compiler can assume that  exceptions happen only at a throw statement or at a function call . 

(MSDN, "Exception Handling: Default Synchronous Exception Model")

Я проверил, вставил вызов функции с exception внутрь try, и попал в catch.

Кроме того, существует ключ компилятора /EH, который регулирует "the model of exception handling" (на него есть ссылка на упомянутой странице MSDN).

Убрал вызов функции, поставил ключ /EHa ("asynchronous"), и тоже попал в catch.


То есть не всё так плохо :)
...
Рейтинг: 0 / 0
Исключения в релизе не обрабатываются
    #34251942
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчёт вызова функции я похоже погорячился. Оно её или оптимизирует так, что она ничего не делает вообще, или Unhandled Exception происходит внутри функции :(


В своих программах я пользуюсь try/catch, и в релизе оно тоже работает, но у меня нет catch(...), а только типизированное (например, CDBException), поэтому я с такой проблемой не сталкивался.


С ключом /EHa таки входит в catch.
...
Рейтинг: 0 / 0
Исключения в релизе не обрабатываются
    #34251969
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле у тебя просто в релизе программа грохается из-за чего-то типа
защиты памяти.

1) Проверь чтобы в опциях компиляции стояло /EHa :

Use /EHa to specify the asynchronous exception handling model (C++ exception handling with structured exception handling exceptions). /EHa may result in a less performant image because the compiler will not optimize a catch block as aggressively, even if the compiler does not see a throw.

Use /EHa if you want to catch an exception raised with something other than a throw. The following sample will generate an exception:

Или помести все в еще один стек для SEH-exceptions.
Но это НЕ ПОМОЖЕТ найти проблему, естественно.

2) Ищи багу.
...
Рейтинг: 0 / 0
Исключения в релизе не обрабатываются
    #34253223
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо: /EHa помогло.

Я исключения использую только для перехвата багов своих и чужих (код не полностью мой). Типа нарушения защиты памяти, деления на ноль и т.п.
Прога занимается приемом/передачей на сервак в инете и одно из требований чтобы она могла работать автономно (на серваке из планировщика например), т.е. произошло исключение, перехватил, в лог записал и завершился. Нехорошо если конечные пользователи видят предложение "обратиться к разработчику". Несколько раз такое замечали и не могли понять что это такое, все свалили на установку dial-up содинения, т.к. win отдельный поток создает при использовании RAS. Воссоздать проблему у себя не удалось.

Чтобы по максимому баги отловить на debug версии сделал код обработки исключений только в релизе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#if !defined(TRY)
	#if defined(_DEBUG)
		#define TRY_RELEASE if(TRUE)
		#define CATCH if(FALSE)
	#else
		#define TRY_RELEASE try
		#define CATCH catch(...)
	#endif
#endif
По хорошему сюда бы проверку включена опция /EHa или нет? Или как-то включить насильно что-то вставив в этот код
...
Рейтинг: 0 / 0
Исключения в релизе не обрабатываются
    #34479886
Fragg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения за тупой вопрос (в С++ пишу второй день) у меня C++ Builder 6 и try тоже не работает, как в настройках компилятора установить ключ /HEa?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исключения в релизе не обрабатываются
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]