Russian Qt Forum
Ноябрь 23, 2024, 21:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: И еще про обработку исключений  (Прочитано 10356 раз)
Sanya
Гость
« : Июнь 24, 2010, 11:03 »

Доброго времени суток!

Не могу понять как реализовать обработку исключений в Qt под Windows XP.

Делаю пример:
Код
C++ (Qt)
   QPushButton* pb = new QPushButton(this);
   pb->show();
   delete pb;
 
   try {
       pb->show();
   } catch(std::exception &e) {
       QMessageBox::about(this, "Error", "Catch error!");
   } catch (...) {
       QMessageBox::about(this, "Error", "Something error!");
   }
 

Приложение тупо вылетает на этом месте.
Винда пишет "Возникли ошибки ... и хочет послать отчет" ....

КАК нормально отлавливать такие глюки?
Записан
crackedmind
Гость
« Ответ #1 : Июнь 24, 2010, 11:27 »

А с каких пор функция show () стала кидать исключения?
Записан
Barmaglodd
Гость
« Ответ #2 : Июнь 24, 2010, 11:29 »

Код
C++ (Qt)
   QPushButton* pb = new QPushButton(this);
   pb->show();
 
!!!!    delete pb;
 
   try {
       pb->show();
   } catch(std::exception &e) {
       QMessageBox::about(this, "Error", "Catch error!");
   } catch (...) {
       QMessageBox::about(this, "Error", "Something error!");
   }
 

Это так и задумано?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Июнь 24, 2010, 11:37 »

>>Это так и задумано?
это видимо для теста и сделано, т.е. далее обращение к несуществующему объекту.
И, как я понял, исключение в коде не ловится
Записан

Юра.
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Июнь 24, 2010, 11:38 »

Segmentation Fault не ловится через try {} catch(){}.

Это избитая тема. Я тоже с ней разбирался, можешь почитать: http://www.visualdata.ru/blog/109-segv-signal.html
Записан

Гугль в помощь
Sanya
Гость
« Ответ #5 : Июнь 24, 2010, 11:40 »

Да, так и задумано.
Это упрощенная ситуация следующего глюка:

Программа уже достаточно сильно разрослась и нет, нет да вылезает глюк обращения к несуществующему объекту. Дабы user не впадала в "kernel panic" хочется выкинуть какое-то сообщение да и написать там для меня где именно. Организовать отлов таких моих упущений я вижу только через try-catch.

P.S.:
 Пока писал появились понимающие меня люди, очень рад и благодарен.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 24, 2010, 11:44 »

По умолчанию ловится только то что испускается throw (C++ exception). Можно заставить ловить и др. исключения, почитать напр. здесь http://msdn2.microsoft.com/en-us/library/1deeycx5.aspx

Но в любом случае нет никакой гарантии что исключение вообще возникнет при работе с удаленным указателем. Так что это не метод
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #7 : Июнь 24, 2010, 11:53 »

Старайся избегать delete, используй умные указатели, при удалении всегда зануляй... Что еще посоветовать? Присоединяюсь к предыдущему посту, что на 100% никакой отлов sigsegv не страхует от непредсказуемого поведения программы.

Под линупсом для чистки кода мне помогает valgrind, полезно периодически проверяться на вшивость.
Записан

Гугль в помощь
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Июнь 24, 2010, 11:55 »

Цитировать
в любом случае нет никакой гарантии что исключение вообще возникнет при работе с удаленным указателем

после удаления объекта занятая им память возвращена в system pool, и уже не принадлежит приложению, выделенный ранее сегмент удален из соответствующей таблицы, поэтому любое обращение к удаленному объекту - это обращение к объекту вне приложения, следовательно segfault

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

а работу exception достаточно проверять (int*)0 = 0;  Смеющийся
« Последнее редактирование: Июнь 24, 2010, 11:57 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июнь 24, 2010, 12:10 »

после удаления объекта занятая им память возвращена в system pool, и уже не принадлежит приложению, выделенный ранее сегмент удален из соответствующей таблицы, поэтому любое обращение к удаленному объекту - это обращение к объекту вне приложения, следовательно segfault
Если бы это было так - жить было бы намного проще  Улыбающийся Увы, после удаления память может оставаться валидной (и не только на Вындоуз). Грубо говоря, ОС поддерживает "таблицы" для страниц, а не для каждого блока памяти. Поэтому "успешная" запись в удаленный блок (с результатом битая куча/heap)  - явление рядовое
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #10 : Июнь 24, 2010, 12:16 »

+1
Записан

Гугль в помощь
Sanya
Гость
« Ответ #11 : Июнь 24, 2010, 12:17 »

Полностью с вами согласен про "не дело лезть в пустоту" и занулять указатели(и так и делаю), но мое приложение лишь клиент, и вот когда на сервере меняется логика без моего ведома иногда начинаются залезания в пустоту.
Спасибо за советы, буду разбираться как их прикрутить у меня.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Июнь 24, 2010, 12:35 »

Цитировать
Грубо говоря, ОС поддерживает "таблицы" для страниц, а не для каждого блока памяти.

прально, только выделяемые приложению блоки находятся в таблице страниц приложения, и к нему относятся, а возвращенные системе - в таблице страниц системы... и GPF генерится соответственно этим таблицам

на x86 во всяком случае так, на ARM вроде бы тоже (не встречал хорошего описания его управления памятью)

во всяком случае, за все время, сколько я сознательно за деньги много программирую, обращение к возвращенному блоку не давало слета только в одной ОС - в MS-DOS  Смеющийся
Записан

2^7-1 == 127, задумайтесь...
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #13 : Июнь 24, 2010, 12:48 »

Гурман, да ты везунчик  Подмигивающий

Хоть они и страницы приложения, но все равно размер у них 4 Kb, и в одну страницу умещается несколько десятков объектов, один из них удаляется, но страница то остается...
Записан

Гугль в помощь
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #14 : Июнь 24, 2010, 12:58 »

кхм... а я почти никогда не захватываю такими мелкими кусками  Подмигивающий - у меня стратегия такая, оптимизация расхода, стараюсь, если захватывать, то кусками не менее 256К

так что, дело не везении  Подмигивающий
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.106 секунд. Запросов: 22.