0 / 0 / 1
Регистрация: 08.09.2011
Сообщений: 30
|
||||||
1 | ||||||
Обработка исключений16.07.2012, 17:08. Показов 1408. Ответов 14
Метки нет Все метки)
(
Добрый день!
Столкнулся с такой проблемой. У меня есть класс
Если при создании объекта возбуждается исключение, то должен выполняться код из блока catch (как я понимаю), но вместо этого в функции OnMouseMove возникает ошибка, когда я пытаюсь обратиться к переменной T. Я так понимаю, что когда возникает исключение, то объект класса MyClass не создается, и в WndProc я пытаюсь обратиться к несуществующему объекту. Но я не понимаю, почему не выполняется код из блока catch! (кстати, если в catch поставить точку останова, то все прекрасно работает)
0
|
|
16.07.2012, 17:08 | |
Ответы с готовыми решениями:
14
Обработка исключений с пмощью структурированной обработки исключений Обработка исключений Обработка исключений Обработка исключений |
32 / 30 / 6
Регистрация: 21.06.2012
Сообщений: 91
|
|
16.07.2012, 18:02 | 2 |
приложите код блока catch, может не так ловите исключение?
0
|
0 / 0 / 1
Регистрация: 08.09.2011
Сообщений: 30
|
||||||
16.07.2012, 22:28 [ТС] | 3 | |||||
0
|
0 / 0 / 1
Регистрация: 08.09.2011
Сообщений: 30
|
||||||
17.07.2012, 10:31 [ТС] | 5 | |||||
Если проверять при обработке сообщения WM_MOUSEMOVE
Однако если пытаться все тело функции WndProc обернуть в try, то он не ловит эту ошибку.
0
|
32 / 30 / 6
Регистрация: 21.06.2012
Сообщений: 91
|
|
17.07.2012, 13:28 | 6 |
Я правда поудалял части OpenGl в приложенном проекте, но у меня catch поймал. Студия у меня 2008. Как вариант, попробуйте сделать тот же механизм в простом проекте. А так все верно и должно работать.
0
|
0 / 0 / 1
Регистрация: 08.09.2011
Сообщений: 30
|
|
17.07.2012, 15:01 [ТС] | 7 |
Действительно. Если без OpenGL все прекрасно ловит. Интересно, из-за чего тогда так может быть? И как быть, если мне нужно юзать OpenGL? Каждый раз перед обращением к p_class проверять его на существование...смысл тогда вообще исключений?
а с OpenGL вообще не пробовали запускать?
0
|
181 / 107 / 13
Регистрация: 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 / 1
Регистрация: 08.09.2011
Сообщений: 30
|
||||||
17.07.2012, 16:01 [ТС] | 9 | |||||
Да, про PostQuitMessage я понял, спасибо.
Тогда такой код:
0
|
32 / 30 / 6
Регистрация: 21.06.2012
Сообщений: 91
|
|
17.07.2012, 17:32 | 10 |
С OpenGL я не пробовал, так как никогда с ним дело не имел и что там нужно подключать не в курсе (приложенный проект был MSVS 2010, поэтому я просто создал свой пустой проект и накидал туда файлы). А по поводу верности использования try catch, я ничего неверного не вижу.
0
|
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456
|
|
17.07.2012, 21:09 | 11 |
Феанор,
В этом случае приложение должно постоянно завершаться.
0
|
0 / 0 / 1
Регистрация: 08.09.2011
Сообщений: 30
|
|
18.07.2012, 00:16 [ТС] | 12 |
Постоянно? Даже когда нет исключений?
Я еще раз посмотрел про исключения, но так и не понимаю, что не так с try/throw/catch. И кстати, даже в таком случае приложение не завершается, а возникает та же ошибка в OnMouseMove.
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
18.07.2012, 00:44 | 13 |
WndProc может позватся еще до создания MyClass. В частности она может позваться и с сообщением от мышки. Поэтому краш происходит не из-за бросания исключения и не из-за некорректного отлова этого исключения, а из-за обращения к несозданному объекту. Как это правильно лечить - хз. Самое простое - при обработке проверять, а можно ли обращатся к p_class.
0
|
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456
|
|
18.07.2012, 01:29 | 14 |
Что то ты не так делаешь, у меня твой код работает и приложение завершается без ошибки.
Экземпляр класса действительно не создается, так как конструктор класса до конца не отрабатывается, а прерывается throw. Применение в даном случае throw и есть не правильное использование конструкции try, throw, catch.
0
|
0 / 0 / 1
Регистрация: 08.09.2011
Сообщений: 30
|
|
18.07.2012, 11:25 [ТС] | 15 |
DU, почему то если исключения не возникает, то WndProc не вызывается до создания p_class (по крайне мере, ошибок нет, если нет исключений, и при обработке сообщений мы обращаемся уже к созданному объекту).
Nukutu, может это зависит от настроек среды? Я все равно не понимаю. Если я вызываю throw в конструкторе, то память же должна освободиться?
0
|
18.07.2012, 11:25 | |
18.07.2012, 11:25 | |
Помогаю со студенческими работами здесь
15
Обработка исключений Обработка исключений
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |