Russian Qt Forum

Qt => Работа с сетью => Тема начата: Ruzzz от Ноябрь 01, 2009, 13:07



Название: Использование кодов ошибок QTcpSocket::SocketError
Отправлено: Ruzzz от Ноябрь 01, 2009, 13:07
Хотел бы спросить ваше мнение. Для меня не понятен один момент. Создал класс сервера, в котором выполняю listen и в случае ошибки делаю emit onError(serverError(), errorString()), в «главный» класс. Заметил, что если порт занят, то получаем errorString = The bound address is already in use (serverError = 8, QAbstractSocket::AddressInUseError), что не совсем информативно. Далее посмотрел что в QtNetwork/qabstractsocket.h описанных ошибок (enum SocketError) не так много. Правильно ли я понимаю, что каждый код ошибки может быть общим для нескольких ситуаций? (Понимаю что можно порыться по коду, но мне пока не легко это дается). То есть передавая коды ошибок «на вверх», есть вероятность, что мы не сможем точно определить ситуацию в которой она произошла? Я не говорю участок кода :), а именно ситуация, понятно что многие ошибки могут быть в разных участках, это логично.

Допустим вполне возможно, что конкретная ошибка QAbstractSocket::AddressInUseError свойственна только listen (хотя это можно проверить простым поиском по файлам исходников, ну и конечно же я допускаю, что важны знания, которых у меня может не быть, чтобы логично определить такие ситуации), но вот посмотрев ее код в qtcpserver.cpp, я не обнаружил присвоения этой ошибки, похоже это делается где-то «в глубине» d->socketEngine. То есть появляется вопрос, а если этот d->socketEngine выполняется не только в listen? Это всего лишь пример, и разговор не конкретно об этой ошибке.

Еще один фактор, который сбивает с толку, это то что описание ошибки, нужно получать в тот же момент (ошибки) используя errorString. Почему нет общей «базы» ошибок для QtNetwork, чтобы в любой момент по коду получить ее описание? Что, для одного кода ошибки, может быть разное описание, в зависимости от ситуации?

Надеюсь смог объяснить суть не понимания :).

То есть как я понимаю, лучше ввести свои собственные коды ошибок, и «на вверх» передавать именно их?


Название: Re: Использование кодов ошибок QTcpSocket::SocketError
Отправлено: Zmeishe от Ноябрь 02, 2009, 10:59
Весьма маловероятно, что в Qt сама генерит ошибки при работе с сетью.
Скорее всего, Qt получает ошибки от API функций конкретной ОСи и по своему их интерпретирует.
Т.е. Qt имеет свой enum{...} с кодами ошибок, и получив состояние ошибки от API, Qt заменяет их на свои собственные согласно технической документации на конкретную ОСь.
Для Linux это может быть 2, для Windows может быть 4, а для Qt это serverError = 8.


Название: Re: Использование кодов ошибок QTcpSocket::SocketError
Отправлено: Rcus от Ноябрь 02, 2009, 12:05
Qt возвращает некоторые коды ошибок, но все равно для корректной обработки часто необходим контекст вызова, так что если ошибку нельзя обработать прямо в месте возникновения лучше обернуть ее в отдельный объект.
Что же до базы сообщений, то это невозможно по причине динамического формирования сообщений в некоторых местах (поиск :vimgrep /setError.*(.*arg(/ ~/qt-4.6.0-beta1-arm/src/**/*.cpp дает несколько результатов)