测量工具介绍#

本节暂时只介绍测量工具的异常处理机制。

章节目标#

  • 了解测量工具中的异常处理机制

异常处理机制#

测量工具中可能发生的异常主要来自其脚本流程。

通常情况下,在执行脚本流程过程中抛出的异常将导致测量工具执行失败,输出的 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": "异常信息内容"
}