halcon异常处理 C++的方式汇总

一、Halcon 的异常体系主要继承自 HException 基类,所有图像采集、算子执行相关的异常均派生自该基类。

使用标准的 try-catch 块捕获 HException,并通过 ErrorNum() 和 ErrorMessage() 获取具体的错误码和错误描

1、基础异常捕获

#include "HalconCpp.h" #include <iostream>

try {

HalconCpp::HObject image;

// 假设 acquisition 是一个已初始化的采集对象

acquisition.GrabImage(&image);

}

catch (const HalconCpp::HException& e)

{

// 获取异常错误码

HalconCpp::HTuple error_code = e.ErrorNum();

// 获取异常错误信息

std::string error_msg = e.ErrorMessage().Text();

std::cerr << "Halcon Error Code: " << error_code.I() << std::endl;

std::cerr << "Halcon Error Msg: " << error_msg << std::endl;

}

 

2、 针对特定异常的精准处理

在实际业务中,通常需要对特定的异常(如图像采集超时)进行针对性处理。例如,图像采集超时对应的错误码通常为  20901

image

 

3、 高级异常日志记录
为了便于生产环境的故障排查,可以封装一个异常日志记录函数,提取异常发生时的程序行号、操作符等详细信息:

void CatchHexceptLog(const HalconCpp::HException& HDevExpDefaultException,
const std::string& functName, std::string& htMessage)
{
HalconCpp::HTuple htException, hv_ErrorLine, hv_Operator, hv_OperatorMsg;

// 将异常对象转换为 HTuple 以便提取详情
HDevExpDefaultException.ToHTuple(&htException);

// 提取异常发生的程序行号、操作符及消息
HalconCpp::HException::GetExceptionData(htException, "program_line", &hv_ErrorLine);
HalconCpp::HException::GetExceptionData(htException, "operator", &hv_Operator);
HalconCpp::HException::GetExceptionData(htException, "error_message", &hv_OperatorMsg);

std::string strLine = hv_ErrorLine.ToString().Text();
std::string strOperator = hv_Operator.ToString().Text();
std::string msgError = HDevExpDefaultException.ErrorMessage().Text();

// 格式化完整的错误信息
htMessage = functName + " --> Line:" + strLine +
", Op:" + strOperator + ", Msg:" + msgError;
}

// 使用示例:
try {
// 你的 Halcon 算法逻辑
}
catch (const HalconCpp::HException& excp) {
std::string errMess;
CatchHexceptLog(excp, __FUNCTION__, errMess);
std::cerr << errMess << std::endl;
}

二、InstallHHandler 不仅可以抓取 Halcon 异常,而且在 C++ 开发中,它是让 C++ 的 try-catch 能够成功捕获 Halcon 异常的关键机制

为什么需要 InstallHHandler

在默认情况下,Halcon 拥有自己内置的异常处理流程。当发生异常时,Halcon 会优先捕获并处理(例如弹出一个错误提示框)。如果此时你在 C++ 中使用标准的 try-catch,往往无法捕获到该异常,甚至可能导致程序直接崩溃12
为了让 C++ 能够接管异常处理,你需要:
  1. 自定义一个异常处理函数:在这个函数中,将 Halcon 的异常重新抛出(throw)。
  2. 安装自定义处理器:使用 HException::InstallHHandler() 将你的自定义函数安装到 Halcon 中。
完成这两步后,Halcon 的异常就会被转交给 C++ 的 try-catch 

#define HCPP_LEGACY_API
#include "HalconCpp.h"
#include <iostream>

// 1. 自定义异常处理函数,将异常重新抛出
void MyExceptionHandler(const HalconCpp::HException& except)
{
throw except;
}

int main()
{
// 2. 在 try-catch 之前,安装自定义异常处理
HalconCpp::HException::InstallHHandler(&MyExceptionHandler);

try
{
// 测试一个 Halcon 内部异常(例如对空数组求最大值)
HalconCpp::HTuple hv_a, hv_Max;
hv_a = HalconCpp::HTuple();
tuple_max(hv_a, &hv_Max);
}
// 3. 现在 C++ 可以成功捕获到 Halcon 异常了
catch (const HalconCpp::HException& except)
{
HalconCpp::Herror heror = except.ErrorCode();
std::cout << "成功捕获 Halcon 异常,错误码: " << heror << std::endl;
}

return 0;
}

 

三、Halcon 还提供了 set_check 算子。你可以通过 set_check("~give_error") 暂时关闭 Halcon 自身的异常处理,让算子返回一个错误码(Herror),然后再通过 get_error_text 获取错误信息,最后用 set_check("give_error") 恢复异常处理2

 
总结:如果你希望在 C++ 中优雅地使用 try-catch 来统一处理 Halcon 异常,必须配合使用 InstallHHandler
 
posted @ 2026-07-06 17:29  QuincyYi  阅读(8)  评论(0)    收藏  举报