测量工具介绍#
本节暂时只介绍测量工具的异常处理机制。
章节目标#
了解测量工具中的异常处理机制
异常处理机制#
测量工具中可能发生的异常主要来自其脚本流程。
通常情况下,在执行脚本流程过程中抛出的异常将导致测量工具执行失败,输出的 visionflow::props::GaugeRegionList 为无效结果。
你可以通过捕获并分析抛出的异常来定位异常发生的位置。
如果你希望在发生异常时不抛出,而是执行脚本流程中未受影响的部分并获取结果,可以启用测量工具的异常抑制模式。
通过 visionflow::param::GaugeParameters::set_suppress_exceptions()
方法来启用或禁用异常抑制模式。默认构造的测量工具中该模式为禁用状态。
默认异常模式#
在默认模式下,测量工具脚本流程中发生的异常会立即抛出,类型为 visionflow::excepts::PythonScriptError 。
该异常的详细信息中会嵌套包含一个 JSON 字符串表明异常发生的求解项名称、异常类型和异常信息。
捕获该异常并调用 details() 方法可以一个 JSON 字符串:
try {
// 执行测量工具脚本流程
} catch (const visionflow::excepts::PythonScriptError& e) {
std::string details_string = e.details();
}
该 JSON 字符串的结构为:
{
"message": "{\"item\":\"求解项名称\",\"type\":\"异常类型名称\",\"message\":\"异常信息内容\"}",
"other_fields": "其他字段"
}
其 message 字段为另一个 JSON 字符串, 再次解析 可以得到如下结构:
{
"item": "求解项名称",
"type": "异常类型名称",
"message": "异常信息内容"
}
异常抑制模式#
测量工具启用异常抑制模式后,在脚本流程内抛出异常时将捕获异常并继续执行未受影响的部分,并输出未受影响部分的结果。
在该模式下,如果某个求解项发生异常,直接或间接依赖于该求解项的后续求解项均不会被执行。这将导致输出结果不完整。
捕获的所有异常信息将被存储在测量工具输出的各个 visionflow::GaugeRegion 中。
你可以调用 visionflow::GaugeRegion::error_items() 方法获取发生异常的求解项列表,
再对其中的每个求解项调用 visionflow::GaugeRegion::get_error() 方法获取对应的异常信息。
// 假定该 GaugeRegionList 来自测量工具的输出结果
visionflow::props::GaugeRegionList result;
for (const auto& [region_id, region] : result) {
std::cout << "本次执行共出现 " << region.error_size() << " 个异常:" << std::endl;
for (const auto& item_name : region.error_items()) {
std::string error_content = region.get_error(item_name);
std::cout << "求解项 " << item_name << " 发生异常" << std::endl;
}
}
获取到的异常信息,即上面例子中的 error_content 是一个 JSON 字符串,结构为:
{
"item": "求解项名称",
"type": "异常类型名称",
"message": "异常信息内容"
}