
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.60] |
![]() |
|
Страницы: (10) « Первая ... 3 4 [5] 6 7 ... 9 10 все ( Перейти к последнему сообщению ) |
Сообщ.
#61
,
|
|
|
Цитата cppasm @ UnhandledExceptionFilter НЕ ЛОВИТ ИСКЛЮЧЕНИЯ ЯЗЫКА, она ловит только системные исключения. Он ловит ВСЕ исключения и SEH и C++. Добавлено Цитата niXman @ Qraizer, покажи код который как-то ни так работает на мингве, и "так" на "правильном" компиляторе. чтоб было о чем с девелоперами общаться. Пожалуйста тебе: ![]() ![]() #include <windows.h> #include <stdio.h> #include <tchar.h> #include <conio.h> int z,p=1,d=0; LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS except_info) { printf ("Поймали исключение. Код 0x%X.\n",except_info->ExceptionRecord->ExceptionCode); return EXCEPTION_EXECUTE_HANDLER; } int _tmain(int argc, _TCHAR* argv[]) { SetConsoleCP (1251); SetConsoleOutputCP (1251); SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter); //SEH, деление на ноль z=p/d; //сюда можно будет попасть только с использованием __except printf("Нажмите любую клавишу...\n"); _getch(); return 0; } niXman, ты думаешь по твоим просьбам разработчики GCC вот так вот разбегутся и сразу прям реализуют поддержку SEH на Windows? ![]() GCC изначально разрабатывался для Unix-Linux, MSVC естественно для Windows родной. Поэтому есть золотое правило: в Unix-Linux используй GCC, в Windows использую MSVC. И не будет никаких заморочек! ![]() |
Сообщ.
#62
,
|
|
|
Цитата neokoder @ ты думаешь по твоим просьбам разработчики GCC вот так вот разбегутся и сразу прям реализуют поддержку SEH на Windows? нет. цель не в этом. просто я полагал, что в этом примере нет SEH... Добавлено при том, вот что выводит твой пример: Цитата C:\test>except In TopLevelUnhandledExceptionFilter. Catched exception with code 0xC0000094. покажи что он должен выводить. Добавлено т.е. проблема в том, что не выводит это?: printf("Нажмите любую клавишу...\n"); |
Сообщ.
#63
,
|
|
|
Цитата neokoder @ Цитата cppasm @ UnhandledExceptionFilter НЕ ЛОВИТ ИСКЛЮЧЕНИЯ ЯЗЫКА, она ловит только системные исключения. Он ловит ВСЕ исключения и SEH и C++. Тебе самому не надоело одно по одному гонять? В сообщении номер 5 я тебе сказал и показал, как именно она не ловит C++ исключения. Потом мы выяснили, что она ловит C++ исключения если исползуется MSVS, вот твоё сообщение номер 12: Цитата В MSVS всё будет работать. Я думал может и в твоём компиляторе по аналогии заработает. И щас ты снова безапелляционно, без всяких оговорок на компилятор заявляешь, что заявляешь. Не стыдно? Неплохое начало холивара. |
Сообщ.
#64
,
|
|
|
Цитата niXman @ при том, вот что выводит твой пример: Естественно в MSVC он это и должен выводить. Речь идёт о GCC. GCC(Cygwin) у меня выводит следующее: ![]() ![]() 0 [main] seh 4292 exception::handle: Exception: STATUS_INTEGER_DIVIDE_BY_Z ERO 2167 [main] seh 4292 open_stackdumpfile: Dumping stack trace to seh.exe.stack dump Цитата niXman @ т.е. проблема в том, что не выводит это?: printf("Нажмите любую клавишу...\n"); Он и не должен выводить. Посмотри я подправил код. Будет выводить только при использовании __try, __except, а ТоpUnhandledExceptionFilter это последний код который выполнит программа если он возвращает EXCEPTION_EXECUTE_HANDLER. Так что все правильно. Слуiай, а ты не в MinGW компилил пример? Может это только у Cygwin нет поддержки работоспособной SetUnhandledExceptionFilter? |
Сообщ.
#65
,
|
|
|
Цитата neokoder @ Естественно в MSVC он это и должен выводить. ок ![]() Цитата neokoder @ Речь идёт о GCC. я в курсе ![]() Цитата neokoder @ у меня выводит следующее: я хз чем ты тестишь. но самое интересное в том, что приведенный вывод я получил использовав свои сборки MinGW. никакого MSVC. посему, еще раз повторяю: покажи код который как-то ни так работает на мингве, и "так" на "правильном" компиляторе. спасибо. Добавлено и да, сейчас я установлю экспресс студию, что умельцы мне моцг не парили. а то прям чудеса какие-то творятся... |
Сообщ.
#66
,
|
|
|
повстанец, не поднимай пыть, ладно? Я говорил о том что в MSVC UnhandledExceptionFilter ловит ВСЕ исключения и SEH и C++. А то что там всякие неполноценные реализации GCC для Windows не работают как надо это меня мало интересует. Эт ты фанат
![]() ![]() |
Сообщ.
#67
,
|
|
|
только что еще и доку по SetUnhandledExceptionFilter() прочел. код собранный MinGW`ом работает как и должен.
|
Сообщ.
#68
,
|
|
|
Цитата niXman @ но самое интересное в том, что приведенный вывод я получил использовав свои сборки MinGW. Ну вот значит это косяки Cygwin. Значит будем считать, что SetUnhandledExceptionFilter отлично пашет в MinGW. А что насчёт __try __except поддерживается этот синтаксис в MinGW? И скажи какой версией GCC компилишь? И MinGW какая версия? Сейчас поставлю, посмотрю сам ради интереса. Добавлено niXman, в общем такой код скомпилится в MinGW? ![]() ![]() #include <windows.h> #include <stdio.h> int z,p=1,d=0; LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS except_info) { printf ("Поймали исключение. Код 0x%X.\n",except_info->ExceptionRecord->ExceptionCode); return EXCEPTION_EXECUTE_HANDLER; } int main() { SetConsoleCP (1251); SetConsoleOutputCP (1251); SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter); __try { //SEH, деление на ноль z=p/d; //исключение bad:alloc (С++ исключение) //__int64 *pI = new __int64[0xFFFFFFF]; } __except(EXCEPTION_EXECUTE_HANDLER) { printf("Попали в __except\n"); } printf("Программа завершила свою работу. Нажмите любую клавишу...\n"); getchar(); return 0; } |
Сообщ.
#69
,
|
|
|
Цитата neokoder @ повстанец, не поднимай пыть, ладно? Я говорил о том что в MSVC UnhandledExceptionFilter ловит ВСЕ исключения и SEH и C++. Лгун. Я один тут не вижу слова MSVC? Цитата сообщение номер 64 UnhandledExceptionFilter НЕ ЛОВИТ ИСКЛЮЧЕНИЯ ЯЗЫКА, она ловит только системные исключения. Цитата Он ловит ВСЕ исключения и SEH и C++. |
Сообщ.
#70
,
|
|
|
Цитата neokoder @ Ну вот значит это косяки Cygwin. ну дык! сижвин и не должен это обрабатывать! он же эмулятор! ![]() Цитата neokoder @ А что насчёт __try __except поддерживается этот синтаксис в MinGW? микрософткомпилятор славится своим не соответствием стандарту. ты что считаешь, что его несоответствия должны перенести в стандарт? ![]() ни один компилятор в здравом уме не станет реализовывать __try __except. засмеют же. Цитата neokoder @ И скажи какой версией GCC компилишь? И MinGW какая версия? у меня в пописи. 4.6.1/4.6.2/4.7.0 |
Сообщ.
#71
,
|
|
|
Цитата повстанец @ Я один тут не вижу слова MSVC? Специально для тебя: Цитата cppasm @ UnhandledExceptionFilter НЕ ЛОВИТ ИСКЛЮЧЕНИЯ ЯЗЫКА, она ловит только системные исключения. Он ловит ВСЕ исключения и SEH и C++ в MSVC. И ещё вот это также специально для тебя ![]() Цитата cppasm @ Бажит повстанец, потому что не читает ни MSDN, ни то, что ему пишут (тему правда уже почикали). |
Сообщ.
#72
,
|
|
|
![]() |
Сообщ.
#73
,
|
|
|
код скомпиленный в msvc2010-express работает так же. значит вопрос закрыт.
|
Сообщ.
#74
,
|
|
|
Цитата niXman @ микрософткомпилятор славится своим не соответствием стандарту. ты что считаешь, что его несоответствия должны перенести в стандарт? ни один компилятор в здравом уме не станет реализовывать __try __except. засмеют же. Ну хорошо, давай в стандартном варианте. Вот такой код будет работать правильно в MinGW: ![]() ![]() #include <windows.h> #include <stdio.h> int z,p=1,d=0; LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS except_info) { printf ("Поймали исключение. Код 0x%X.\n",except_info->ExceptionRecord->ExceptionCode); return EXCEPTION_EXECUTE_HANDLER; } int main() { SetConsoleCP (1251); SetConsoleOutputCP (1251); SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter); try { //SEH, деление на ноль z=p/d; } catch(...) { printf("Попали в catch\n"); } //исключение bad:alloc (С++ исключение) //__int64 *pI = new __int64[0xFFFFFFF]; printf("Программа завершила свою работу. Нажмите любую клавишу...\n"); getchar(); return 0; } В MSVC получаем(компилируя c /EHa): ![]() ![]() Попали в catch Программа завершила свою работу. Нажмите любую клавишу... Добавлено Цитата niXman @ код скомпиленный в msvc2010-express работает так же. значит вопрос закрыт. Ёпти, ты думаешь я не проверяю что ли прежде чем выкладывать код? Если я даю код значит я его проверил в MSVC. Так что не зачем тебе было проверять в MSVC++. Ты лучше последний примерчик скомпиляй плиз в своём MinGW. Какой будет результат? А то я тут пока скачаю, пока поставлю... |
Сообщ.
#75
,
|
|
|
Цитата neokoder @ давай в стандартном варианте ты походу троллишь, да? какой же это стандартный вариант? ![]() стандартным, будет выбросить throw из try{} блока. выводит это: Цитата C:\test>cl except.cpp Microsoft ® 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 Copyright © Microsoft Corporation. All rights reserved. except.cpp except.cpp(26) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc Microsoft ® Incremental Linker Version 10.00.30319.01 Copyright © Microsoft Corporation. All rights reserved. /out:except.exe except.obj C:\test>except Попали в __except Программа завершила свою работу. Нажмите любую клавишу... C:\test>g++ except.cpp -oexcept C:\test>except Поймали исключение. РљРѕРґ 0xC0000094. C:\test> Добавлено neokoder, еще, способы убедить всех в том что микрософт-специфик расширения являются стандартом, будут? ![]() |