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、 针对特定异常的精准处理

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?
try-catch,往往无法捕获到该异常,甚至可能导致程序直接崩溃- 自定义一个异常处理函数:在这个函数中,将 Halcon 的异常重新抛出(
throw)。 - 安装自定义处理器:使用
HException::InstallHHandler()将你的自定义函数安装到 Halcon 中。
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") 恢复异常处理
try-catch 来统一处理 Halcon 异常,必须配合使用 InstallHHandler
浙公网安备 33010602011771号