Управление ошибками

Возможно вы столкнетесь с тем, что ваше приложение не работает так, как вы предполагали, разрабатывая, тестируя и развертывая его. В этих случаях важно предусмотреть возможность вывода и диагностики ошибок.

Журналы консоли

Если приложение ведет себя непонятно, или не так, как вы ожидаете, может быть полезно обратиться к консоли и проверить ход работы приложения. 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();
    }
}