
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Возникли некоторые непонятки. Вот прочитал главу Рихтера об исключениях. Он пишет, что исключения С++ раскрываются компилятором в SEH-исключения с дополнительной проверкой типа аргумента в блоке catch. Логично предположить что условие catch(...) будет отличаться от __except только тем, что не будет возможности продолжать выполнение программы (значение фильтра исключения EXCEPTION_CONTINUE_EXECUTION).
Есть ключ компилятора /EH (Exception Handling Model): a - The exception-handling model that catches asynchronous (structured) and synchronous (C++) exceptions. s - The exception-handling model that catches C++ exceptions only and tells the compiler to assume that extern C functions do throw an exception. c - If used with s (/EHsc), catches C++ exceptions only and tells the compiler to assume that extern C functions never throw a C++ exception. /EHca is equivalent to /EHa. Если ключ компилятора /EH не задан, то по умолчанию: If /EH is not specified, the compiler will catch structured and C++ exceptions, but will not destroy C++ objects that will go out of scope as a result of the exception. Собственно вопросы: 1) В чём различие между С-программой и C++-программой в плане обработки исключений? Как вообще отличить С-программу от С++? Только по списку функций и соответственно по типу используемых библиотек или ещё как-то? 2) Фраза "but will not destroy C++ objects that will go out of scope as a result of the exception" означает что при возникновении С++ исключения по умолчанию не будут вызваны деструткоры для всех локальных объектов? 3) В чём отличие ключа /EHa от отсутствия ключа /EH в принципе? Может в том что будут вызываться деструкторы для С++ исключений? |
Сообщ.
#2
,
|
|
|
Цитата 1) В чём различие между С-программой и C++-программой в плане обработки исключений? в Си как мне помнится нету обработки исключений, только в С++ Цитата Как вообще отличить С-программу от С++? По использованию кода С++ Цитата 2) Фраза "but will not destroy C++ objects that will go out of scope as a result of the exception" означает что при возникновении С++ исключения по умолчанию не будут вызваны деструткоры для всех локальных объектов? да Тока в итоге не понятно что тебя интересует С++ исключения или SEH |
Сообщ.
#3
,
|
|
|
Цитата Dem_max @ в Си как мне помнится нету обработки исключений, только в С++ Ну __try/__except,__try/__finally(т.е. SEH исключения) по-любому можно использовать на с-программе. И это всё же будет ещё С-программа. То есть вы хотите сказать если я использую операторы try, catch, то это уже автоматически C++-программа. Да? Вообще, меня интересует как наилучшим образом обрабатывать исключения в программе, которая долждна работать 24х7. Микрософты рекомендуют использовать Try-Catch в С++ программе: Цитата MSDN The Win32 structured exception-handling mechanism works with both C and C++ source files. However, it is not specifically designed for C++. You can ensure that your code is more portable by using C++ exception handling. Also, C++ exception handling is more flexible, in that it can handle exceptions of any type. For C++ programs, it is recommended that you use the C++ exception-handling mechanism (try, catch, throw) described in this topic. Получается лучше использовать конструкции try/catch с опцией /EHa. Но единственный вопрос: будут ли вызваны деструкторы при С++-исключении? |
Сообщ.
#4
,
|
|
|
кстати нашел на мелкософтах
Цитата Microsoft C++ now supports the C++ exception handling model, based on the ANSI C++ Standard. This mechanism automatically handles destruction of local objects during stack unwind. If you are writing fault-tolerant C++ code, and you want to implement exception handling, it is strongly recommended that you use C++ exception handling, rather than structured exception handling. (Note that while the C++ compiler supports structured exception handling constructs as described in these articles, the standard C compiler does not support the C++ exception handling syntax.) For detailed information about C++ exception handling, see C++ Exception Handling and the Annotated C++ Reference Manual by Margaret Ellis and Bjarne Stroustrup. ссылка http://msdn.microsoft.com/en-us/library/7w0chfbk(v=vs.80).aspx ну еще http://msdn.microsoft.com/en-us/library/swezty51(v=vs.80).aspx |
Сообщ.
#5
,
|
|
|
Цитата neokoder @ Это будет уже не ANSI/ISO C И это всё же будет ещё С-программа. |
Сообщ.
#6
,
|
|
|
интересно почему не ловится такое исключение
![]() ![]() try { int x,y,z; x = 1; y = 0; z = x/y; } catch(...) { } |
Сообщ.
#7
,
|
|
|
Цитата Dem_max @ This mechanism automatically handles destruction of local objects during stack unwind. Получается, что скорее всего с любой заданной опцией /EH будут вызываться деструкторы. А если /EH не указано, то не будут. Думаю так. Добавлено Цитата Dem_max @ интересно почему не ловится такое исключение Деление на ноль - это SEH-исключение. А опция компилятора по умолчанию /EHsс. Поставь /EHa и будет ловиться. |
Сообщ.
#8
,
|
|
|
Цитата Деление на ноль - это SEH-исключение. SEH тоже не ловится разными исключениями ловится только если ![]() ![]() float x,y,z; x = 1.0; y = 0.0; z = x/y; |
Сообщ.
#9
,
|
|
|
Цитата Dem_max @ SEH тоже не ловится разными исключениями ловится только если Dem_max, надо в диалоговом окне Exceptions, в разделе Win32 Exceptions поставить галку напротив "Integer division by zero". Вообще это странно почему они не включены по умолчанию! Добавлено Блин а для Release-версии всё рано не ловятся, только для Debug! ![]() |
Сообщ.
#10
,
|
|
|
Отключил оптимизацию, всё заработало для Release-Версии. Что ж это получается если хочешь обрабатыватть исключения в конечной(release) программе, забудь про оптимизацию?
|
Сообщ.
#11
,
|
|
|
Цитата neokoder @ Отключил оптимизацию, всё заработало для Release-Версии. Что ж это получается если хочешь обрабатыватть исключения в конечной(release) программе, забудь про оптимизацию? Да нет, всё там ловится. Оптимизатор просто выбрасывает эти совершенно бессмысленные строки. Сделай так, и всё получится: ![]() ![]() int x,y,z=0; try { x = 1; y = 0; z = x/y; } catch(...) { _tprintf(__TEXT("catch \r\n")); } _tprintf(__TEXT("z=%d\r\n"),z); |
Сообщ.
#12
,
|
|
|
вынос int x,y,z=0; за try не помогает
![]() ![]() int x,y,z = 0; try { x = 1; y = 0; printf("X= %i", x); z = x/y; } catch(...) { puts("Exeption in try"); } |
Сообщ.
#13
,
|
|
|
Цитата Dem_max @ вынос int x,y,z=0; за try не помогает Подумай, что именно ты сделал ? Зачем выносить x,y,z за try ? Текст, который я показал, я откомпилировал. Программа работает как надо. При компиляции выдаётся предупреждение: Цитата warning C4723: potential divide by 0 А у тебя ? |
Сообщ.
#14
,
|
|
|
Цитата А у тебя ? а у меня никакого варнинга |
![]() |
Сообщ.
#15
,
|
|
Цитата neokoder @ Когда-то уже много писал по подобному поводу. Где-то вот отсюда и там ниже на страничке.3) В чём отличие ключа /EHa от отсутствия ключа /EH в принципе? Цитата Dem_max @ С -EHa ловится везде. У тебя z не используется, поэтому компилятор наверняка выкинул код её вычисления. Добавь volatile хотя бы. SEH тоже не ловится |