![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 12.01.2011
Сообщений: 186
|
![]()
Заранее извиняюсь за длинный пост.
Есть необходимость обработки ошибок в проекте, о котором пара слов ниже. Проект пишется на QT под MSVC. Будет (да, проекта еще нету, где-то между стадией проектирования и "как же сложно начинать писать новый проект") иметь минимум 5 динамических библиотек + GUI, абстрагированный от всех библиотек кроме двух: первая является сборной солянкой из классов и структур, которые содержат данные, с которыми надо работать; вторая - предоставляет API для работы с этими данными. И вот тут надо реализовать обработку ошибок. От исключений не отказываюсь, но использовать их как-то не хочется. В голову приходит реализация класса с перечисляемыми типами и массивами строк. И реализация для каждого класса, в котором надо ловить ошибки метода getLasError, который будет возвращать код ошибки. Тогда можно будет сделать, чтобы методы класса возвращали bool, и в случае false мы бы вызывали getLastError. Однако неясно что делать, если метод должен возвращать что-либо кроме void; можно конечно упрятать возвращаемый тип в аргументы со ссылкой или указателем, но как-то ненаглядно вызовы получаются тогда. Также непонятно как передавать коды ошибок в GUI, особенно при многопоточности. Код из одной из моих прог. Код:
Тут был 1 класс, который всем рулил, так что особых переживаний по поводу как оно все будет вместе работать не было. Но вот сейчас дело другое: классов много и каждый из них должен иметь свои enum'ы ну и использовать некоторые общие коды (например файл не найден). В общем есть ли идеи, советы, примеры как это реализуется в достаточно крупных проектах? На всякий случай включаю примерную диаграмму что чего должно вызывать в проекте. GUICore (API), DataTypes DB module, Parsers, File I/O module, DataTypes, HTTP Handler
Lingua c++ non penis caninus est.
|
![]() |
![]() |
![]() |
#2 |
Линуксоид
Участник клуба
Регистрация: 31.07.2009
Сообщений: 1,403
|
![]()
В Qt не принято использования исключений для обработки ошибок. Так повелось. Это стиль, вырабатываемый годами. На прикладном уровне в Qt никто исключений не использует и все живут счастливо. Кроме того, в некоторых ситуациях это повышает производительность и упрощает портирование на разные платформы.
Но если свербит, можно переделать QApplication::notify() и ловить эксепшны там: http://doc.qt.nokia.com/latest/excep...rom-exceptions И лучше бы ты писал в раздел про Qt. Не по теме скажу теперь. Лучше именовать возможные значение в enum'ах как-то понятнее. Посмотрите, как это сделано в Qt. Вот например: http://doc.qt.nokia.com/latest/qgrap...ationFlag-enum Даже если вы скажете QGraphicsView::DontSavePainterState , то из названия понятно, частью какого enum'а оно является. Ну или вот примеры: Код:
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su Последний раз редактировалось Obey-Kun; 21.01.2011 в 22:51. |
![]() |
![]() |
![]() |
#3 | |
Форумчанин
Регистрация: 12.01.2011
Сообщений: 186
|
![]()
К QT имеет мало отношения, для информации написал. Меня больше интересует реализация такого метода отлова ошибок в достаточно крупном проекте.
Ну у меня есть пара недель :D Цитата:
То есть вы предлагаете делать enum в проверяемом классе, вместо какого-то общего класса ошибок? Жирновато будет. Особые прибамбасы QString не используются в пояснениях к ошибкам, к тому же русского языка не будет.
Lingua c++ non penis caninus est.
Последний раз редактировалось Dayman; 21.01.2011 в 22:58. |
|
![]() |
![]() |
![]() |
#4 |
Линуксоид
Участник клуба
Регистрация: 31.07.2009
Сообщений: 1,403
|
![]()
QT, о котором ты говоришь, пишется как Qt. Это не аббревиатура. И читается Qt как «кьют». А QT — это QuickTime.
А хорошие проекты проектируются так, чтобы обработка исключений не понадобилась. Для отладки своей программы очень удобно использовать маркосы Qt Q_ASSERT и Q_ASSERT_X. И ещё Q_CHECK_PTR. Но в релизе (при QT_NO_DEBUG) они уже ничего не будут проверять (и это правильно, т.к. релиз это релиз).
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su Последний раз редактировалось Obey-Kun; 21.01.2011 в 22:55. |
![]() |
![]() |
![]() |
#5 | |
Форумчанин
Регистрация: 12.01.2011
Сообщений: 186
|
![]() Цитата:
Вообще исключительных ситуаций я не планирую. Все должно проверяться. Выход где-нибудь за пределы массива не предусмотрен, такого просто не должно быть. А вот обрабатывать FileNotFound, HTTPRequestTimeout и, например, прочие ответы HTTP сервера или появление непредусмотренных полей при парсинге какого-то файла я как раз и хочу.
Lingua c++ non penis caninus est.
Последний раз редактировалось Dayman; 21.01.2011 в 23:27. |
|
![]() |
![]() |
![]() |
#6 |
Линуксоид
Участник клуба
Регистрация: 31.07.2009
Сообщений: 1,403
|
![]()
Если ошибка совсем плохая, то типа qFatal, если нет, то qCritical.
Ну а для засовывание этого в мессейдж бокс используй qInstallMsgHandler. Вот например: Код:
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su Последний раз редактировалось Obey-Kun; 22.01.2011 в 00:31. |
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 12.01.2011
Сообщений: 186
|
![]()
Видимо я очень плохо объясняю.
Забудьте про Qt ![]() Мне хотелось бы узнать как лучше реализовать обработку ошибок с помощью кодов возврата:
Lingua c++ non penis caninus est.
Последний раз редактировалось Dayman; 22.01.2011 в 01:02. |
![]() |
![]() |
![]() |
#8 |
Линуксоид
Участник клуба
Регистрация: 31.07.2009
Сообщений: 1,403
|
![]()
Тогда я бы так сделал:
Код:
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su Последний раз редактировалось Obey-Kun; 22.01.2011 в 01:13. |
![]() |
![]() |
![]() |
#9 | |
Форумчанин
Регистрация: 12.01.2011
Сообщений: 186
|
![]()
Значит один голос за второй пункт. Парсеров правда много будет, так что получиться что-то вроде:
GUI вызывает Core, Core вызывает парсер. Цитата:
Lingua c++ non penis caninus est.
|
|
![]() |
![]() |
![]() |
#10 |
Линуксоид
Участник клуба
Регистрация: 31.07.2009
Сообщений: 1,403
|
![]()
Но я не правда в последней инстанции. Потому что самому такое делать пока не приходилось. Может, тут скажут чего полезного: http://www.linux.org.ru/forum/development/5820291 (уверен, что скажут, т.к. там действительно много людей, которые секут в больших проектах).
И Qt для Windows CE есть. http://qt.nokia.com/products/platfor...or-windows-ce/ Мало того, писать мобильные приложения на кутях — сказка. Недаром их Nokia купила.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обработка ошибок | kardinal94 | Общие вопросы Delphi | 2 | 21.11.2010 20:23 |
Обработка ошибок | Liones | БД в Delphi | 12 | 04.12.2008 07:22 |
Обработка ошибок | Ivanich | JavaScript, Ajax | 1 | 24.04.2008 22:49 |
Обработка ошибок в Delphi 7 | Наташкин | БД в Delphi | 3 | 21.12.2007 22:07 |
Обработка ошибок. | Serviceprofi | Помощь студентам | 7 | 19.11.2007 15:12 |