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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить код ошибки?  (Прочитано 6652 раз)
AVDEY
Гость
« : Март 04, 2012, 18:30 »

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

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

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

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

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Март 04, 2012, 18:55 »

Я не распарсил
Записан

ArchLinux x86_64 / Win10 64 bit
Странник
Гость
« Ответ #2 : Март 04, 2012, 19:04 »

в данном случае при OpenError наличие файла вы можете проверить с помощью exists.
Записан
AVDEY
Гость
« Ответ #3 : Март 04, 2012, 19:38 »

в данном случае при OpenError наличие файла вы можете проверить с помощью exists.
А если файл занят другим процессом с монопольным доступом?

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

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

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Март 04, 2012, 19:51 »

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

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

Просто QFile::error() возвращает очень обширно, типа не открыл, не прочитал, не записал, не переименовал и т. д.
а почему не знает, зато детально это знает функция QFile::errorString() но в текстовом виде, поэтому и есть мысль что должен быть цифровой эквивалент QFile::errorString().
Записан
Странник
Гость
« Ответ #6 : Март 04, 2012, 20:18 »

а если файл занят другим процессом, то file.exists() && (file.error() == QFile::OpenError). на отказ в доступе вроде бы отдельный код ошибки был. я это к тому, что мне всегда стандартных кодов хватало. а их малое число, подозреваю, обусловлено кросплатформенностью библиотеки. если в вашем случае и в самом деле недостаточно конкретно - используйте API целевых платформ.
« Последнее редактирование: Март 04, 2012, 20:19 от Странник » Записан
AVDEY
Гость
« Ответ #7 : Март 04, 2012, 21:33 »

я это к тому, что мне всегда стандартных кодов хватало.
К примеру делаем QFile::rename (перемещаем файл) error возвращает ошибку RenameError = 10,
и какие дальнейшие действия файл уже существует, исходный файл занят, недостаточно места на диске и. т. д.
Можно конечно проверить открывается ли файл, существует ли файл с заданным именем в директории назначения проверить свободное место на диске и размер файла, но как по мне уж очень много лишних действий надо делать тем болеее (опять повторюсь) QFile::errorString() различает ошибки. На одну ошибку error несколько стрингових объяснений. (файл не существует, не найден путь к файлу, файл занят другим процессом, файл назначения уже существует)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Март 04, 2012, 22:55 »

Никогда не понимал "пост" обработки - сначала попытаться что-то сделать, а потом разбираться, что же именно не получилось. И не важно, разбираем ли мы код ошибки, коих миллион, или ловим эксепшн.
Если разбор ошибки не нужен, то булки в качестве возвращаемого значения достаточно.
Если разбор ошибки нужен, то нет никакой разницы - проверить до вызова действия существует ли файл, или отловить эксепшн "file exists". Тем более, что этих ошибок не так много (йа писал копир файлов, йа знаю).
Ну и хз, каких вам там ошибок не хватает у QFile'а - вроде невалидные параметры в него сложно передать, в отличие от винапи.
Записан
AVDEY
Гость
« Ответ #9 : Март 05, 2012, 10:27 »

... или отловить эксепшн "file exists". ...

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

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

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Март 05, 2012, 10:47 »

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

Предположим ситуацию: исходный файл существует и доступен для чтения, его требуется переместить, в директории назначения файл уже существует с таким же именем но он занят другим процессом file.exists() вернет QFile::OpenError то есть можно предположить что файла нет, а в то же время при перемещении получим ошибку.
Ну проверьте существование и права - если они нормальны, то скорее всего файл занят. И есть мнение что обработать ошибку открытия можно лишь 1м способом, независимо от того, чем эта ошибка вызвана - ничего не делать:)
Записан
Странник
Гость
« Ответ #11 : Март 05, 2012, 12:19 »

И есть мнение что обработать ошибку открытия можно лишь 1м способом, независимо от того, чем эта ошибка вызвана - ничего не делать:)
это в общем случае. но существуют и частные.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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