错误管理

有时,在初始设计、测试和部署时,应用程序可能无法按预期运行。发生这种情况时,如果能通过一些方法来显示和诊断错误,那将会为我们带来很大帮助。

控制台日志

当您的应用程序以您不期望或无法理解的方式运行时,到控制台查看应用程序内部的工作可能会有所帮助。AppStudio 包含内置控制台(有关详细信息,请参阅捕获控制台输出),并且当应用程序在其中运行时,Qt Creator 会显示控制台消息。还可以通过单行代码提供其他控制台信息,以提供可能有用的属性或将该信息作为因输出复杂而可能无法正确运行的函数的标志。

以下代码示例会在控制台日志中打印一行,并在发生更改时显示新的 filepath

        TextField {
            Layout.fillWidth: true
            text: fileFolder.path
            onEditingFinished: {
                fileFolder.path = text.trim();
                console.log("New filepath:", fileFolder.path);
            }
        }

如需获取更多控制台支持(包括实时输出和日志文件形式),AppStudio AppFramework 的记录组件可提供一系列可配置控制台日志和在其中提供帮助的功能。

要启用控制台日志,请在记录组件中将 enabled 属性设置为 true。可在后台进行设置以记录整个会话,也可以通过开关或按钮仅在需要的时候启动记录。日志启动后,系统会参考 outputLocation 属性来确定日志输出的位置和形式。该目标位置可以是文件路径(此时应用程序将创建一个日志文件并输出到该文件中),也可以是 syslog 控制台的 URL(此时应用程序将直接输出到该处)。可通过 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() 设置格式

添加错误消息

同时也存在可以预测和识别,但无法解决的错误。这可能是由于应用程序中存在不可避免的限制;例如,如果一个应用程序要求持续访问在线服务,那么在没有 Internet 访问的环境中可能无法正常工作。可在发射大量组件提供的 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();
    }
}