Russian Qt Forum

Qt => Общие вопросы => Тема начата: Sanya от Июнь 24, 2010, 11:03



Название: И еще про обработку исключений
Отправлено: 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!");
   }
 

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

КАК нормально отлавливать такие глюки?


Название: Re: И еще про обработку исключений
Отправлено: crackedmind от Июнь 24, 2010, 11:27
А с каких пор функция show () стала кидать исключения?


Название: Re: И еще про обработку исключений
Отправлено: Barmaglodd от Июнь 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!");
   }
 

Это так и задумано?


Название: Re: И еще про обработку исключений
Отправлено: lit-uriy от Июнь 24, 2010, 11:37
>>Это так и задумано?
это видимо для теста и сделано, т.е. далее обращение к несуществующему объекту.
И, как я понял, исключение в коде не ловится


Название: Re: И еще про обработку исключений
Отправлено: navrocky от Июнь 24, 2010, 11:38
Segmentation Fault не ловится через try {} catch(){}.

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


Название: Re: И еще про обработку исключений
Отправлено: Sanya от Июнь 24, 2010, 11:40
Да, так и задумано.
Это упрощенная ситуация следующего глюка:

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

P.S.:
 Пока писал появились понимающие меня люди, очень рад и благодарен.


Название: Re: И еще про обработку исключений
Отправлено: Igors от Июнь 24, 2010, 11:44
По умолчанию ловится только то что испускается throw (C++ exception). Можно заставить ловить и др. исключения, почитать напр. здесь http://msdn2.microsoft.com/en-us/library/1deeycx5.aspx (http://msdn2.microsoft.com/en-us/library/1deeycx5.aspx)

Но в любом случае нет никакой гарантии что исключение вообще возникнет при работе с удаленным указателем. Так что это не метод


Название: Re: И еще про обработку исключений
Отправлено: navrocky от Июнь 24, 2010, 11:53
Старайся избегать delete, используй умные указатели, при удалении всегда зануляй... Что еще посоветовать? Присоединяюсь к предыдущему посту, что на 100% никакой отлов sigsegv не страхует от непредсказуемого поведения программы.

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


Название: Re: И еще про обработку исключений
Отправлено: Гурман от Июнь 24, 2010, 11:55
Цитировать
в любом случае нет никакой гарантии что исключение вообще возникнет при работе с удаленным указателем

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

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

а работу exception достаточно проверять (int*)0 = 0;  ;D


Название: Re: И еще про обработку исключений
Отправлено: Igors от Июнь 24, 2010, 12:10
после удаления объекта занятая им память возвращена в system pool, и уже не принадлежит приложению, выделенный ранее сегмент удален из соответствующей таблицы, поэтому любое обращение к удаленному объекту - это обращение к объекту вне приложения, следовательно segfault
Если бы это было так - жить было бы намного проще  :) Увы, после удаления память может оставаться валидной (и не только на Вындоуз). Грубо говоря, ОС поддерживает "таблицы" для страниц, а не для каждого блока памяти. Поэтому "успешная" запись в удаленный блок (с результатом битая куча/heap)  - явление рядовое


Название: Re: И еще про обработку исключений
Отправлено: navrocky от Июнь 24, 2010, 12:16
+1


Название: Re: И еще про обработку исключений
Отправлено: Sanya от Июнь 24, 2010, 12:17
Полностью с вами согласен про "не дело лезть в пустоту" и занулять указатели(и так и делаю), но мое приложение лишь клиент, и вот когда на сервере меняется логика без моего ведома иногда начинаются залезания в пустоту.
Спасибо за советы, буду разбираться как их прикрутить у меня.


Название: Re: И еще про обработку исключений
Отправлено: Гурман от Июнь 24, 2010, 12:35
Цитировать
Грубо говоря, ОС поддерживает "таблицы" для страниц, а не для каждого блока памяти.

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

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

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


Название: Re: И еще про обработку исключений
Отправлено: navrocky от Июнь 24, 2010, 12:48
Гурман, да ты везунчик  ;)

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


Название: Re: И еще про обработку исключений
Отправлено: Гурман от Июнь 24, 2010, 12:58
кхм... а я почти никогда не захватываю такими мелкими кусками  ;) - у меня стратегия такая, оптимизация расхода, стараюсь, если захватывать, то кусками не менее 256К

так что, дело не везении  ;)


Название: Re: И еще про обработку исключений
Отправлено: navrocky от Июнь 24, 2010, 13:23
Не используешь Qt? Не используешь классы в динамической памяти? Консольный C ? :o


Название: Re: И еще про обработку исключений
Отправлено: Гурман от Июнь 24, 2010, 13:52
я про свои объекты говорил, которые Qt мало где наследуют... :)

классы нельзя "использовать в динамической памяти" - в ней можно создавать экземпляры объектов  ;)

а с Qt в огромном числе случаев можно обходиться стеком, и delete писать не надо  ;)


Название: Re: И еще про обработку исключений
Отправлено: navrocky от Июнь 25, 2010, 10:12
Практически все кутэшные классы используют приватную имплементацию, память под которую выделяется динамически.

Цитировать
классы нельзя "использовать в динамической памяти" - в ней можно создавать экземпляры объектов

Я это и имел ввиду  ;D


Название: Re: И еще про обработку исключений
Отправлено: SASA от Июнь 25, 2010, 10:33
Программа уже достаточно сильно разрослась и нет, нет да вылезает глюк обращения к несуществующему объекту.

Можно использовать QPоinter. Перед использованием проверяешь на ноль. Описанную проблему решает.