Russian Qt Forum

Qt => Вопросы новичков => Тема начата: AVDEY от Март 04, 2012, 18:30



Название: Как получить код ошибки?
Отправлено: AVDEY от Март 04, 2012, 18:30
Начал разбираться с Qt, и не обнаружил аналога функции GetLastError();
Например при работе с файлом.
Функция bool QFile::open(...); возвращает фалсе
я нашел что могу получить QFile::error(); - которая возвращает 15 вариантов ошибки
QFile::errorString(); -возвращает текстовою информацию об ошибке

Так вот функция  error() возвращает OpenError = 5
а errorString(); может вернуть: файл не найден, процесс не может получить доступ к файлу.  и т. д.

Как получить код ошибки? 

С практики программирования на MVC++6.0 функция GetLastError(); использовалась часто, так как получив код ошибки можно предпринять какие то действия без участия пользователя, и это касается не только QFile.


Название: Re: Как получить код ошибки?
Отправлено: kuzulis от Март 04, 2012, 18:55
Я не распарсил


Название: Re: Как получить код ошибки?
Отправлено: Странник от Март 04, 2012, 19:04
в данном случае при OpenError наличие файла вы можете проверить с помощью exists.


Название: Re: Как получить код ошибки?
Отправлено: AVDEY от Март 04, 2012, 19:38
в данном случае при OpenError наличие файла вы можете проверить с помощью exists.
А если файл занят другим процессом с монопольным доступом?

Я просто к тому что программа различает тип ошибки судя с вызова функции errorString(); как получить ее цифровой эквивалент как GetLastError();

Да не нужно привязываться к открытию файла, я просто привел пример. Ситуация когда нужно знать код ошибки и что то автоматом переделать а не просто вывести errorString(); возникает не только при работе с фалами.


Название: Re: Как получить код ошибки?
Отправлено: LisandreL от Март 04, 2012, 19:51
QFile::error() и возвращает код ошибки. Более детализированного нет. Можно конечно вызывать нативные функции системы (тот же GetLastError) но надо понимать, что в разных ОС коды ошибок будут зачастую не совпадать.


Название: Re: Как получить код ошибки?
Отправлено: AVDEY от Март 04, 2012, 20:06
QFile::error() и возвращает код ошибки. Более детализированного нет. Можно конечно вызывать нативные функции системы (тот же GetLastError) но надо понимать, что в разных ОС коды ошибок будут зачастую не совпадать.

Просто QFile::error() возвращает очень обширно, типа не открыл, не прочитал, не записал, не переименовал и т. д.
а почему не знает, зато детально это знает функция QFile::errorString() но в текстовом виде, поэтому и есть мысль что должен быть цифровой эквивалент QFile::errorString().


Название: Re: Как получить код ошибки?
Отправлено: Странник от Март 04, 2012, 20:18
а если файл занят другим процессом, то file.exists() && (file.error() == QFile::OpenError). на отказ в доступе вроде бы отдельный код ошибки был. я это к тому, что мне всегда стандартных кодов хватало. а их малое число, подозреваю, обусловлено кросплатформенностью библиотеки. если в вашем случае и в самом деле недостаточно конкретно - используйте API целевых платформ.


Название: Re: Как получить код ошибки?
Отправлено: AVDEY от Март 04, 2012, 21:33
я это к тому, что мне всегда стандартных кодов хватало.
К примеру делаем QFile::rename (перемещаем файл) error возвращает ошибку RenameError = 10,
и какие дальнейшие действия файл уже существует, исходный файл занят, недостаточно места на диске и. т. д.
Можно конечно проверить открывается ли файл, существует ли файл с заданным именем в директории назначения проверить свободное место на диске и размер файла, но как по мне уж очень много лишних действий надо делать тем болеее (опять повторюсь) QFile::errorString() различает ошибки. На одну ошибку error несколько стрингових объяснений. (файл не существует, не найден путь к файлу, файл занят другим процессом, файл назначения уже существует)


Название: Re: Как получить код ошибки?
Отправлено: Авварон от Март 04, 2012, 22:55
Никогда не понимал "пост" обработки - сначала попытаться что-то сделать, а потом разбираться, что же именно не получилось. И не важно, разбираем ли мы код ошибки, коих миллион, или ловим эксепшн.
Если разбор ошибки не нужен, то булки в качестве возвращаемого значения достаточно.
Если разбор ошибки нужен, то нет никакой разницы - проверить до вызова действия существует ли файл, или отловить эксепшн "file exists". Тем более, что этих ошибок не так много (йа писал копир файлов, йа знаю).
Ну и хз, каких вам там ошибок не хватает у QFile'а - вроде невалидные параметры в него сложно передать, в отличие от винапи.


Название: Re: Как получить код ошибки?
Отправлено: AVDEY от Март 05, 2012, 10:27
... или отловить эксепшн "file exists". ...

я не очень еще силен в Qt - не понял что вы имели ввиду.

Предположим ситуацию: исходный файл существует и доступен для чтения, его требуется переместить, в директории назначения файл уже существует с таким же именем но он занят другим процессом file.exists() вернет QFile::OpenError то есть можно предположить что файла нет, а в то же время при перемещении получим ошибку.


Название: Re: Как получить код ошибки?
Отправлено: Авварон от Март 05, 2012, 10:47
я не очень еще силен в Qt - не понял что вы имели ввиду.
Я в общем слцчаеговорил, не привязываясь к Qt.

Предположим ситуацию: исходный файл существует и доступен для чтения, его требуется переместить, в директории назначения файл уже существует с таким же именем но он занят другим процессом file.exists() вернет QFile::OpenError то есть можно предположить что файла нет, а в то же время при перемещении получим ошибку.
Ну проверьте существование и права - если они нормальны, то скорее всего файл занят. И есть мнение что обработать ошибку открытия можно лишь 1м способом, независимо от того, чем эта ошибка вызвана - ничего не делать:)


Название: Re: Как получить код ошибки?
Отправлено: Странник от Март 05, 2012, 12:19
И есть мнение что обработать ошибку открытия можно лишь 1м способом, независимо от того, чем эта ошибка вызвана - ничего не делать:)
это в общем случае. но существуют и частные.