Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631

Исключения и блоки __try/__except

22.03.2022, 23:37. Показов 1983. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Не знаю как решить такую проблемку. Вот код
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <windows.h>
#include <iostream>
 
using namespace std;
 
 
DWORD filter_function(DWORD  ec, int& a)
{
    // проверяем код исключения
    if (ec == EXCEPTION_INT_DIVIDE_BY_ZERO)
    {
        cout << "Integer divide by zero exception." << endl;
        cout << "a = " << a << endl;
 
        // восстанавливаем ошибку
        a = 10;
 
        // возобновляем выполнение программы
        cout << "Continue execution." << endl;
        cout << "a = " << a << endl;
 
        return EXCEPTION_CONTINUE_EXECUTION;
    }
 
    else
        // прекращаем выполнение программы
        return EXCEPTION_EXECUTE_HANDLER;
}
 
int main()
{
    int a = 0;
    int b = 1000;
 
    __try
    {
        b /= a;
        cout << "b = " << b << endl;
    }
    __except (filter_function(GetExceptionCode(), a))
    {
        cout << "There was some exception." << endl;
    }
 
    return 0;
}


Программа уходит в бесконечный цикл, я так понимаю, после вызова функции
Code
1
filter_function(GetExceptionCode(), a)
инструкция должна вернуться к коду b /= a; или я ошибаюсь? Если не ошибаюсь, то почему программа уходит в бесконечный цикл?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.03.2022, 23:37
Ответы с готовыми решениями:

Исключения и блоки try/except
Всем привет. Как известно, есть функции которые: * возвращают тип void * не возвращают ошибку через GetLastError() * при этом,...

__try __except не работает
Подскажите, пожалуйста, почему это не работает и как ловить другие исключения. // l4.cpp : Defines the entry point for the console...

Нужно добавить в код исключения использую блоки try, catch, не понимаю что делаю неправильно
Задание: Составить описание класса для представления времени в 24-часовом формате. Разработать методы установки даты и отдельных ее полей...

6
841 / 347 / 68
Регистрация: 20.11.2012
Сообщений: 815
23.03.2022, 10:03
Перезапуск выполнения начинается с той же ассемблерной инструкции, а не сишной.
Exception происходит на инструкции деления. Значение делителя - в регистре. В фильтре ты меняешь значение в памяти, но в регистре оно не поменяется.

Assembler
1
2
3
4
5
6
7
8
9
    mov ecx, DWORD PTR _a$[ebp] <-тут сохранили а в ecx
 
; 36   :    {
; 37   :        b /= a;
 
    mov eax, DWORD PTR _b$[ebp] 
    cdq
    idiv    ecx <-тут происходит исключение и сюда вернется после обработчика. В [a] уже 10, но в ecx по прежнему 0
    mov DWORD PTR _b$[ebp], eax
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
26.03.2022, 05:48  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
Перезапуск выполнения начинается с той же ассемблерной инструкции, а не сишной.
Т.е. никак не исправить тот код, который я привёл в первом посте, чтобы он работал правильно?

Цитата Сообщение от WhiteP Посмотреть сообщение
Exception происходит на инструкции деления. Значение делителя - в регистре. В фильтре ты меняешь значение в памяти, но в регистре оно не поменяется.
Assembler
1
idiv    ecx <-тут происходит исключение и сюда вернется после обработчика. В [a] уже 10, но в ecx по прежнему 0
Т.е. исключение в данном случае это что? Тут не так как в ЯВУ, что происходит далее, функция не вызывается, но что-то происходит. Я в ассемблере слабоват и это мягко говоря.

Assembler
1
9 mov DWORD PTR _b$[ebp], eax
- я так понимаю, что эта инструкция не выполняется?
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
27.03.2022, 10:12
Цитата Сообщение от Liss29 Посмотреть сообщение
никак не исправить тот код, который я привёл в первом посте, чтобы он работал правильно?
можно исправить, использовав обычные методы отлова исключений - условия, перебор, выборку и т.д.

__try/__except не предназначен для простейших прихотей юзеров.
этим сигнальным исключением отлавливают сбойную инструкцию процессора, перед тем как система\программа упадёт с ошибкой.

попробуйте в юзермоде инициализировать какую-нить Zw-фукнцию из ядра (ntoskrnl.exe), например ZwOpenFile
на EXCEPTION_EXECUTE_HANDLER перейдите в дизассемблер и вы увидите, что программа падает на второй инструкции.

вот для чего нужно это исключение - менять значение регистров, сегментных регистров и флагов в процессе отладки и смотреть на результат.
а не для отлова банального деления на ноль..
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
29.03.2022, 05:52  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
вот для чего нужно это исключение - менять значение регистров, сегментных регистров и флагов в процессе отладки и смотреть на результат.
а не для отлова банального деления на ноль..
Ну то, что написано по тому и учусь, видимо, весьма поверхностно описано концепция исключений, там указывается на структуры в частности CONTEXT в которой сохраняются системные значения, в частности, регистры процессора, но повторюсь тема не раскрыта.

Цитата Сообщение от _lunar_ Посмотреть сообщение
можно исправить, использовав обычные методы отлова исключений - условия, перебор, выборку и т.д.
?
0
841 / 347 / 68
Регистрация: 20.11.2012
Сообщений: 815
29.03.2022, 09:36
Цитата Сообщение от Liss29 Посмотреть сообщение
Ну то, что написано по тому и учусь
Почитай Дж. Рихтера. Там твоя ситуация с зацикливанием один в один описана в разделе "Будьте осторожны с EXCEPTION_CONTINUE_EXECUTION".

Цитата Сообщение от Liss29 Посмотреть сообщение
?
C
1
if(b)a/=b;
SEH - низкоуровневый инструмент и должен использоваться, когда понимаешь что, как и зачем происходит "внизу". Например, тот же EXCEPTION_INT_DIVIDE_BY_ZERO технически можно поймать и исправить, но только если ты контролируешь свой код на самом низком уровне (в случае выше - через CONTEXT исправить ECX, но для этого нужно знать, что делитель именно в ECX - то есть писать изначально на асме).
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
29.03.2022, 23:40  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
Почитай Дж. Рихтера. Там твоя ситуация с зацикливанием один в один описана в разделе "Будьте осторожны с EXCEPTION_CONTINUE_EXECUTION".
С книги на книгу перепрыгивать, как по мне, вообще запутаюсь.

Не по теме:

Цитата Сообщение от WhiteP Посмотреть сообщение
SEH - низкоуровневый инструмент и должен использоваться, когда понимаешь что, как и зачем происходит "внизу".
Совсем ерунда, да? только ещё асм осталось выучить и всё...) Зачем тогда это информация даётся в в книге не посвящённой ассемблеру да ещё и в столь урезанном варианте... не ясно. На кой ... тогда нужны эти яву лучше асм изучать.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.03.2022, 23:40
Помогаю со студенческими работами здесь

Организация собственного исключения и передача в него исходного исключения
Для обработки исключений при работе с БД я создал собственное исключение: public class SQLEntityException : ApplicationException ...

Разбить строку на блоки, а затем эти блоки на отдельные слова
...доброго времени суток, уважаемые форумчане! Возникла задача - разбить строку на блоки, а затем эти блоки на отдельные слова. Не могу...

Востановить взорваные блоки. Создать блоки из одинаковых груп объектов. Задача обратная взрыву блока
Стоит задача. Создать блок, блоки по аналогу, по аналогичным одинаковым с выбраными объектами. Востановить удаленные блоки из одинаковых,...

Как расположить определенные элементы (блоки combobox (как в С#), иные блоки) по 3 колонкам
Приведите пожалуйста пример где я могу расположить по колонкам блоки combobox (в которых будут списки добавить/изменить/удалить)) (как в...

Необходимо разбить массив на блоки 8x8 и блоки записать в отдельный массив
Здравствуйте! Для начала хотел бы понять, как это реализовывается на простом примере предоставленном ниже (Массив 36 элементов, разбить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru