Возможно вы столкнетесь с тем, что ваше приложение не работает так, как вы предполагали, разрабатывая, тестируя и развертывая его. В этих случаях важно предусмотреть возможность вывода и диагностики ошибок.
Журналы консоли
Если приложение ведет себя непонятно, или не так, как вы ожидаете, может быть полезно обратиться к консоли и проверить ход работы приложения. AppStudio содержит встроенную консоль (см. Запись результатов консоли для дополнительной информации), и Qt Creator отобразит сообщения консоли, если приложение запущено из нее. Дополнительная информация консоли может быть получена с помощью строки кода, либо как свойство, которое можно использовать, либо через указание на функцию, поведение которой, возможно, некорректно.
Следующий пример кода показывает строку в журнале консоли, указывающую на новый filepath, если он был изменен
TextField {
Layout.fillWidth: true
text: fileFolder.path
onEditingFinished: {
fileFolder.path = text.trim();
console.log("New filepath:", fileFolder.path);
}
}
Для более продвинутого использования консоли, как в форме потока результатов, так и файлов журнала AppStudio AppFramework предоставляет компонент Logging с набором функций, предназначенных для поддержки и настройки журналов консоли.
Для запуска журнала консоли установите свойство enabled в компоненте Logging на true. Его можно установить в фоновом режиме для записи в журнал всего сеанса, или добавить кнопку или переключатель для запуска записи только тогда, когда это требуется. Как только журнал запускается, он ссылается на свойство outputLocation для определения местоположения для хранения и извлечения. Это может быть или путь к файлу, и в этом случае приложение создаст файл журнала и будет вести запись в него, или URL консоли syslog, и тогда приложение будет вести запись непосредственно туда. Форматирование сообщений журнала можно настроить через свойство messagePattern.
Свойство messagePattern использует серию заполнителей для структурирования информации. Для отображения нужной информации в сообщениях консоли включите следующие заполнители:
Заполнитель | Описание |
---|---|
%{appname} | QCoreApplication::applicationName>() |
%{category} | Категория записи в журнал |
%{file} | Путь к исходному файлу |
%{function} | Функция |
%{line} | Строка исходного файла |
%{message} | Текущее сообщение |
%{pid} | QCoreApplication::applicationPid() |
%{threadid} | Системный ID текущего потока (если его можно получить) |
%{qthreadptr} | Указатель на текущий QThread (результат QThread::currentThread() |
%{type} | "debug", "warning", "critical" или "fatal" |
%{time process} | Время сообщения, в секундах, после запуска процесса |
%{time boot} | Время сообщения, в секундах, чтобы после перезагрузки системы его можно было идентифицировать |
%{time [format]} | Системное время сообщения, с применением формата, с помощью QDateTime::toString() |
Добавление сообщения об ошибке
Существуют ошибки, которые вы можете спрогнозировать и распознать, но не сможете исправить. Это может быть из-за невозможности устранить определенные ограничения; например, приложение, для которого требуется постоянный доступ к онлайн-сервису, не будет работать там, где нет интернета. Это поддерживается с помощью отображения сообщения, в котором сигнал onError добавляется в компоненты, которые работают с ограничениями. Некоторые из этих компонентов также предоставляют дополнительные свойства для передачи информации пользователю о возникновении ошибки, например свойство NetworkRequest errorText.
В следующем примере кода показано, как ввести сообщение об ошибке, если NetworkRequest не сработал, где в сообщении содержится информация о возвращенной ошибке. Здесь также настраивается сбой сетевого запроса путем отправления запроса, который не может быть выполнен.
MessageDialog {
id: messageDialog
title: "Network error"
text: "Error code: " + networkRequest.errorCode + "\n" + networkRequest.errorText
}
NetworkRequest {
id: networkRequest
url: "http://appstudio.arcgis.com/images/index/introview.jpg2"
responseType: "json"
onError: {
messageDialog.open();
}
}
Button {
id: sendBtn
text: "Send Request"
onClicked: {
networkRequest.send();
}
}