Skip to content

Swift 监控与错误处理

qiuwenchen edited this page Mar 7, 2024 · 4 revisions

本文介绍对性能数据、SQL执行、错误信息的监控,以及对错误处理信息的处理。

全局监控

开发者可以注册全局监控,获取性能数据、SQL的执行及报错信息。

性能监控

以下是性能监控的示例代码:

//全局监控
Database.globalTrace(ofPerformance: { (tag, path, handleId, sql, info) in
    print("The handle with id \(handleId) at path \(path) takes \(info.costInNanoseconds) nanoseconds to execute sql \(sql)");
})
//监控单个数据库
database.trace(ofPerformance: { (tag, path, handleId, sql, info) in
    print("The handle with id \(handleId) at path \(path) takes \(info.costInNanoseconds) nanoseconds to execute sql \(sql)");
})

监控回调的 info参数中还可以获取到当前SQL语句执行时读写到的各个类型的文件页的数量,可以进一步分析耗时的原因。

性能监控会影响数据库性能,WCDB 默认不开启性能监控。

SQL 监控

以下是 SQL 监控的示例代码:

//全局监控
Database.globalTrace(ofSQL: { (tag, path, handleId, sql, info) in
    print("The handle with id \(handleId) at path \(path) executed sql \(sql)");
})
//监控单个数据库
database.trace(ofSQL: { (tag, path, handleId, sql, info) in
    print("The handle with id \(handleId) at path \(path) executed sql \(sql)");
})

每一条执行的 SQL 都会毫无遗漏的在监控中体现。对于熟悉 SQLite 的开发者,可以通过该接口确认操作执行的 SQL 与期望是否一致

监控回调中的 info参数在调用setFullSQLTrace(enable:)方法开启全监控模式之后,会携带 SQL 执行的绑定参数,插入的数据的rowid,更新、删除、查询到的数据条数等执行的细节数据,更方便开发者了解数据的变化过程。

SQL监控会带来性能消耗,WCDB 默认不开启 SQL 监控。

错误监控

以下是错误监控的示例代码:

//全局监控
Database.globalTrace(ofError: { (error: WCDBError) in
    assert(error.level != .Fatal)
    print(error)
})
//监控单个数据库
database.trace(ofError: { (error: WCDBError) in
    assert(error.level != .Fatal)
    print(error)
})

每一个错误信息都会在监控中体现,并且在出错时同步回调到监控接口。开发者可以注册该接口将错误输出到日志,和上报到后台进行监控。

所有错误都是 Error 类型,它会包含了error levelcodeextended codemessagetagpathSQL 等相关信息,以便于调试、统计归类和发现问题,其中错误码主要是SQLite的错误码

错误监控其实也作为 WCDB 的日志输出接口,输出一些数据库的内部关键状态,只不过传出的 ErrorlevelNoticeIgnoreDebug

我们推荐开发者开启错误监控,以便于发现错误。

错误处理

除了上述的错误监控,错误还会从函数声明包含 throws 中产生。

do {
    try database.insert(objects: object, intoTable: "non-existent-table")
}catch let error as WCDB.WCDBError {
    // 可以输出一些业务数据相关的错误日志
    // error推荐在监控回调中统一输出到日志
}
Clone this wiki locally