- 1
std::set_unexpected( [] () {} );
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+14
std::set_unexpected( [] () {} );
Студия достала и не позволяла обрабатывать исключения, а они нужны были для демонстрации работы, в итоге навесил такой костыль и включил SEH исключения в параметрах компиляции.
P.S. А зачем программе намеренно устраивать access violation?
Не транслирует. Ты перепутал с Borland C++ Builder
Трансляция остальных ошибок в исключения - implementation defined.
приложение работает как умеет - даже если оно однопоточное - и выглядит как последовательность инструкций
приложению приходит прерывание/сигнал, значит, основной поток приостанавливается на какой то своей инструкции, приложение обрабатывает сигнал, после обработки основной поток может продолжиться
если обработка сигнала подразумевает кончину - особенно, когда это происходит по умолчанию - никому не будет дела до того, что там происходит в основном потоке
т.е. если ты выделял память, захватывал ресурсы и открывал устройства, то операционная система за тебя это всё подчистит
если ты писал в свой файл и недописал, то файл закроется в том состоянии, в котором основной поток его оставил
это в общих словах
везде рекомендуется из своего обработчика SIGFPE завершать процесс, иначе никто ничего не гарантирует
если его заигнорить, то скорее всего программа впадет в бесконечный цикл, т.к. деление на ноль на текущей инструкции будет происходить снова и снова
вроде бы отдельными телодвижениями можно получить user context в обработчике и сдвинуть instruction pointer, но я такого никогда не делал и воспроизводить, если честно, не очень интересно
http://pastebin.com/cDQQ98fF
так же пробовал ловить через __try/__except, на сколько я понял они именно для этих целей созданы, в итоге получал предупреждение при компиляции и тоже самое при отлове.
std::set_unexpected( [] () {throw THuinyaException;} ); чтобы потом обычным трай кечем поймать?
PS: вспомнил правильное название:_set_se_translator
Если случился AV (обращение за границы стека, кучи, попытка прыжка в неисполняемую память и т.п.) - в проге явно что-то пошло не так, и исправить этот НЁХ программными средствами уже практически невозможно.
Вторая проблема поимки AV - оно совсем не гарантированно. Биты доступа расставляются на уровне страничек, не байтов. Поэтому прога может спокойно копаться в невыделенных кусках кучи и даже чуть-чуть за ней, или выполнять код, лежащий неподалеку от границы реального кода, и при этом творить всякую хуйню не поймав AV.
P.S. Для лабы сойдет ;)
upd: вашим, в смысле твоим и LispGovno
Я бы сказал "продолжает ковылять в страну неопределенного поведения". [mode=Ванга]Небось, еще и все предупреждения компилятора отключены.[/mode] Фу-фу-фу!