Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Феанор
0 / 0 / 0
Регистрация: 08.09.2011
Сообщений: 30
#1

Обработка исключений - C++

16.07.2012, 17:08. Просмотров 957. Ответов 14
Метки нет (Все метки)

Добрый день!
Столкнулся с такой проблемой. У меня есть класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MyClass
{
public:
     MyClass(/* какие то параметры*/);
     void OnMouseMove(int X, int Y);
     ~MyClass();
private:
     int T;
};
 
MyClass::MyClass(/* какие то параметры*/)
{
     // инициализирую T исходя из параметров, переданных в конструктор
 
     if (/*условие на параметры*/)   // При определенных параметрах
          throw 1;     // Выбрасываю исключение
}
 
void MyClass::OnMouseMove(int X, int Y)
{
     // Тут я использую переменную T
}
Я создаю объект этого класса в функции CreateWindow (в блоке try), и вызываю метод класса OnMouseMove в WndProc (при сообщении WM_MOUSEMOVE).
Если при создании объекта возбуждается исключение, то должен выполняться код из блока catch (как я понимаю), но вместо этого в функции OnMouseMove возникает ошибка, когда я пытаюсь обратиться к переменной T. Я так понимаю, что когда возникает исключение, то объект класса MyClass не создается, и в WndProc я пытаюсь обратиться к несуществующему объекту. Но я не понимаю, почему не выполняется код из блока catch! (кстати, если в catch поставить точку останова, то все прекрасно работает)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2012, 17:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка исключений (C++):

Обработка исключений с пмощью структурированной обработки исключений - C++
Есть функция, которая определенным образом работает с файлами,но при работе с файлами "не подходящего" типа вызывается необработанное...

Обработка исключений - C++
Программа должна содержать блоки try, catch, точку throw. Задание: Ввод пользователем отрицательного возраста.

Обработка исключений - C++
Почему не перехватывает ошибку и не выводит Error? а прога сама прекращает работу. #include <iostream> using namespace std; ...

Обработка исключений - C++
Уважаемые админы. Знаю, что о помощи надо просить, когда имеются хоть какие-то наработки. К сожалению, тему исключений мало разбирала. А...

Обработка исключений - C++
Проблема. В main создаю объект класса MAS int или string. Нужно, что бы когда int - то заполнялся массив нулями, а когда string -...

Обработка исключений - C++
Подскажите пожалуйста как продолжить выполнение программы после срабатывания оператора catch. catch завершает программу, но ее нужно...

14
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
16.07.2012, 18:02 #2
приложите код блока catch, может не так ловите исключение?
0
Феанор
0 / 0 / 0
Регистрация: 08.09.2011
Сообщений: 30
16.07.2012, 22:28  [ТС] #3
C++
1
2
3
4
5
catch(...)
{
     MessageBox(NULL, L"ERROR", L"ERROR", MB_OK | MB_ICONINFORMATION);
     PostQuitMessage(0);
}
Я не обрабатываю исключения. Просто вывожу сообщение об ошибке и пытаюсь закрыть приложение.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.07.2012, 22:34 #4
Феанор, без всего кода, друдно что либо сказать
0
Феанор
0 / 0 / 0
Регистрация: 08.09.2011
Сообщений: 30
17.07.2012, 10:31  [ТС] #5
Если проверять при обработке сообщения WM_MOUSEMOVE
C++
1
2
if (p_class)
     p_class->OnMouseMove(...)
то все хорошо работает.
Однако если пытаться все тело функции WndProc обернуть в try, то он не ловит эту ошибку.
0
Вложения
Тип файла: zip TestProject3_3.zip (7.7 Кб, 13 просмотров)
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
17.07.2012, 13:28 #6
Я правда поудалял части OpenGl в приложенном проекте, но у меня catch поймал. Студия у меня 2008. Как вариант, попробуйте сделать тот же механизм в простом проекте. А так все верно и должно работать.
0
Феанор
0 / 0 / 0
Регистрация: 08.09.2011
Сообщений: 30
17.07.2012, 15:01  [ТС] #7
Действительно. Если без OpenGL все прекрасно ловит. Интересно, из-за чего тогда так может быть? И как быть, если мне нужно юзать OpenGL? Каждый раз перед обращением к p_class проверять его на существование...смысл тогда вообще исключений?

Цитата Сообщение от cppGhost Посмотреть сообщение
Я правда поудалял части OpenGl в приложенном проекте, но у меня catch поймал. Студия у меня 2008. Как вариант, попробуйте сделать тот же механизм в простом проекте. А так все верно и должно работать.
а с OpenGL вообще не пробовали запускать?
0
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
17.07.2012, 15:28 #8
Цитата Сообщение от Феанор Посмотреть сообщение
Интересно, из-за чего тогда так может быть?
Внимательно почитайте как правильно применять конструкцию try throw catch.
И еще:
The PostQuitMessage function posts a WM_QUIT message to the thread's message queue and returns immediately; the function simply indicates to the system that the thread is requesting to quit at some time in the future.
Т.е на PostQuitMessage программа не будет завершаться, а будет продолжаться до твоего return MainLoop();
И в Init() она после catch доберется до return InitGL();
Вобщем, ошибка на ошибке.
0
Феанор
0 / 0 / 0
Регистрация: 08.09.2011
Сообщений: 30
17.07.2012, 16:01  [ТС] #9
Цитата Сообщение от Nukutu Посмотреть сообщение
The PostQuitMessage function posts a WM_QUIT message to the thread's message queue and returns immediately; the function simply indicates to the system that the thread is requesting to quit at some time in the future.
Т.е на PostQuitMessage программа не будет завершаться, а будет продолжаться до твоего return MainLoop();
И в Init() она после catch доберется до return InitGL();
Да, про PostQuitMessage я понял, спасибо.

Тогда такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int Init()
{
    try
    {
        p_class = new CMyClass();
    }
    catch(...)
    {
        MessageBox(NULL, L"ERROR", L"ERROR", MB_OK | MB_ICONINFORMATION);
        return false;
    }
 
    return InitGL();
}
Разве в этом случае не должно быть уничтожено окно и завершиться работа приложения?
0
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
17.07.2012, 17:32 #10
С OpenGL я не пробовал, так как никогда с ним дело не имел и что там нужно подключать не в курсе (приложенный проект был MSVS 2010, поэтому я просто создал свой пустой проект и накидал туда файлы). А по поводу верности использования try catch, я ничего неверного не вижу.
0
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
17.07.2012, 21:09 #11
Феанор,
В этом случае приложение должно постоянно завершаться.
0
Феанор
0 / 0 / 0
Регистрация: 08.09.2011
Сообщений: 30
18.07.2012, 00:16  [ТС] #12
Постоянно? Даже когда нет исключений?
Я еще раз посмотрел про исключения, но так и не понимаю, что не так с try/throw/catch.

И кстати, даже в таком случае приложение не завершается, а возникает та же ошибка в OnMouseMove.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
18.07.2012, 00:44 #13
WndProc может позватся еще до создания MyClass. В частности она может позваться и с сообщением от мышки. Поэтому краш происходит не из-за бросания исключения и не из-за некорректного отлова этого исключения, а из-за обращения к несозданному объекту. Как это правильно лечить - хз. Самое простое - при обработке проверять, а можно ли обращатся к p_class.
0
Nukutu
176 / 102 / 2
Регистрация: 22.03.2010
Сообщений: 456
18.07.2012, 01:29 #14
Цитата Сообщение от Феанор Посмотреть сообщение
И кстати, даже в таком случае приложение не завершается, а возникает та же ошибка в OnMouseMove.
Что то ты не так делаешь, у меня твой код работает и приложение завершается без ошибки.
Экземпляр класса действительно не создается, так как конструктор класса до конца не отрабатывается, а прерывается throw.
Применение в даном случае throw и есть не правильное использование конструкции try, throw, catch.
0
Феанор
0 / 0 / 0
Регистрация: 08.09.2011
Сообщений: 30
18.07.2012, 11:25  [ТС] #15
DU, почему то если исключения не возникает, то WndProc не вызывается до создания p_class (по крайне мере, ошибок нет, если нет исключений, и при обработке сообщений мы обращаемся уже к созданному объекту).


Nukutu, может это зависит от настроек среды?

Цитата Сообщение от Nukutu Посмотреть сообщение
Применение в даном случае throw и есть не правильное использование конструкции try, throw, catch.
Я все равно не понимаю. Если я вызываю throw в конструкторе, то память же должна освободиться?
0
18.07.2012, 11:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2012, 11:25
Привет! Вот еще темы с ответами:

Обработка исключений - C++
Как сделать обработку исключения так, чтобы, если, например, вводим количество координат больше, чем можно, программа предлагала, или...

Обработка исключений - C++
Есть код программы по поиску совершенных чисел а интервале от a до n. #include <iostream> using namespace std; int...

Обработка исключений - C++
что то я не пойму а что в плюсах нельзя разве сделать что то типа: try { ... } catch (int) { ... }

Обработка исключений - C++
Ребят, всем привет) помогите разобраться с вроде как простой задачкой, но весьма затруднительной для меня) По исключениям инфы мало в...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru