关于运行错误,HALCON/C++默认打印错误信息并且终止程序。然而在某些应用中,放宽这个法则可能更有用。比如,如果一个应用要求用户交互式地指定一个图像文件读取,如果因为用户不能拼错文件名而终止程序的话,会很不方便。因此,HALCON/C++允许集成你自己的错误处理代码。如下的章节将分别介绍面向对象的方法和面向过程的方法

面向对象的方法

如果一个运行错误发生在面向对象的调用中,类HException的实例将会创建。(图5.8为类的定义)

class LIntExport HException {
public:HException(const HException &except);HException(const char *f, Hlong l, const char *p, Herror e, const char *m);HException(const char *f, Hlong l, const char *p, const char *m);HException(const char *f, Hlong l, const char *p, Herror e);static Handler InstallHHandler(Handler proc);void           PrintException(void);static Handler handler;   /* handler in use */Hlong          line;      /* line number where error occured */char           *file;     /* file name where error occured */char           *proc;     /* Name of procedure/operator */Herror         err;       /* error number */char           *message;  /* error text */
};

Figure 5.8: Part of the declaration of the class HException.
以上这个例子,包含了错误的所有信息。其中一个异常重要的成员如下:

  • line:错误发生的项目行号
  • file:错误发生的文件名
  • proc:实际的HALCON算子的名字
  • err: 错误代号,see below
  • message: 错误文本
    当发生后,HException的对象被传递到所谓的异常句柄。HALCON的默认异常句柄将打印对应的错误信息,并且终止程序。

作为另一种可替代的方法,你可以实现和使用你自己的异常处理。为了作为HALCON exception handler,一个程序必须有如下的签名:

typedef void (*Handler)(const Halcon::HException &exception);

然后通过HException的方法InstallHHandler安装你的异常处理程序。(见图5.8)这样一旦发生了运行错误,HALCON然后调用你自己的程序,传递实际的异常的对象作为参数。

如下的例子将展示如何使用一个用户指定的异常处理器和标准的C++异常处理机制(try catch)一起使用.对应的项目example_errorhandle.cpp可以在%HALCONEXAMPLES%\cpp的子目录找到。它实现了以上指定的目的:你可以键入一个文件名去读取;如果文件不存在,项目将打印一个对应的信息但不会停止程序,而是继续运行。

项目的开始,一个用户指定的异常处理器使用如下的方法安装:

HException::InstallHHandler(&MyHalconExceptionHandler);

被安装的程序简单地调用C++的异常处理机制throw:

void MyHalconExceptionHandler(const Halcon::HException& except)
{throw except;
}

ReadImage的调用被一个try 区域封装,一个可能的异常可以在catch中捕获:

Herror  error_num; try
{image = HImage::ReadImage(filename);
}
catch (HException &except)
{error_num = except.err;return error_num;
}
return H_MSG_TRUE;

面向过程的方法

正如section “Calling HALCON Operators”中看到的那样,面向过程的方法返回一个Herror类型的数据。这个数据会分为两类:信息H_MSG_* and 错误 H_ESR_*.

典型地,如果没有错误发生,HALCON算子返回信息H_MSG_TRUE.

一旦遇到一个错误,HALCON默认打印所谓的错误信息并且终止程序。你可以通过算子set_check指定异常是否忽略。如下的例子代码检测一个文件是否正确打开;一旦遇到错误,将打印所谓的错误信息,可以通过get_error_text获得错误信息。

Herror         error_num;
char           message[1024];
long           file;set_check("~give_error");
error_num = open_file("not_existing_file", "input", &file);
set_check("give_error");if (error_num != H_MSG_TRUE)
{get_error_text(error_num, message);cout << "HALCON error " << error_num << ": " << message;
}

请注意一些数组算子没有返回值。这样,被描述的方法会导致一个内存泄漏。请使用面向对象的方法代替。

halcon/c++接口基础 之异常处理相关推荐

  1. halcon/c++接口基础 之 halcon初认识

    从今天开始,开始更新博客,主要分享自己最近正在翻译的Halcon/C++教程.先给出第一篇文章,由于此文章,是用latex写的,直接导成html,保存在七牛云存储上,所以直接点击链接就看到,后面我将直 ...

  2. halcon/c++接口基础 之 控制参数

    HALCON/C++可以处理各种不同类型的字母数字混合的控制参数,如下: 离散数字(long) 浮点数字(double) 字符串(char*) 控制参数的一个特殊形式是句柄,提供了途径去访问复杂的数据 ...

  3. halcon/c++接口基础 之 HALCON图像变量类

    在HALCON/C++中,HObject是一个基类,可以表示图像变量.另外还有三种类继承自HObject. Class HImage 处理图像 Class HRegion 处理区域 Class HXL ...

  4. halcon/c++接口基础 之内存管理

    所有的HALCON类,不仅仅HImage,HRegion,HTuple,HFramegrabber等等,还有面向过程的方法中使用的Hobject,都可以使用默认的析构器自动释放内存. ( see al ...

  5. halcon/c++接口基础 之 析构函数和Halcon算子

    所有的HALCON/C++类都提供了默认的析构函数用来自动销毁对应的内存.对于某些类,析构函数基于适合的算子: Windows: HWindow类的析构函数基于close_window关闭窗口.注意: ...

  6. halcon/c++接口基础 之 构造函数与Halcon算子

    Halcon/C++提供了构造函数,主要基于适合的Halcon算子.比如说HImage和HBarCode基于read_image and create_bar_code_model. 请注意当前的Ha ...

  7. python基础之异常处理

    python基础之异常处理 参考文章: (1)python基础之异常处理 (2)https://www.cnblogs.com/zhangyux/p/6108026.html (3)https://w ...

  8. [C++基础]039_C++异常处理初级出门+中级进阶

    [C++基础]039_C++异常处理初级出门+中级进阶 参考文章: (1)[C++基础]039_C++异常处理初级出门+中级进阶 (2)https://www.cnblogs.com/alephsou ...

  9. java类与接口思维导图_详解java接口基础知识附思维导图

    接口: 官方的含义是---->java接口是一系列方法的声明,是一些方法特征的集合 疑问: 那为什么不用抽象类呢?把他们共有的方法集合起来放在一个抽象类里面,同样可以调用哇,但是反过来想一想如果 ...

最新文章

  1. MySQL之事务管理
  2. flink运行原理_Flink运行架构剖析
  3. linux系统磁盘的分配空间不足,Linux系统磁盘空间不足解决办法
  4. angularjs金额大写过滤器
  5. 徐州有初中计算机编程,徐州初中分布大全(学校+地址+联系方式)
  6. Peephole LSTM、GRU 实战
  7. javassist修炼笔记
  8. 日均千万级消息规模,深捷旅使用函数计算释放运维压力
  9. 怎样在WORD里输入国际音标
  10. 链路聚合的配置(思科)
  11. SharpDevelop源码分析之插件
  12. hangfire 介绍(一)
  13. 《沟通的方法》笔记十七:道歉
  14. submit()和onsubmit()的区别
  15. 神策发布丨企业微信数字化营销解决方案!
  16. Landsat8卫星介绍
  17. 【路径追踪】数学工具--蒙特卡洛方法(Monte Carlo)
  18. 注册表项目不能删除的解决方案
  19. GDOI 2023 游记
  20. 若用8位机器码表示二进制数-111

热门文章

  1. gitbook 入门教程之解决windows热加载失败问题
  2. namespace 或The content of element type mapper must match EMPTY
  3. 在ubuntu下各种格式软件安装及常用命令
  4. JS---捕捉URL地址,以及模仿GET方法
  5. c#中的接口的定議以及接口與抽象类的區別
  6. 微服务之consul(一) - 诗码者 - 博客园
  7. Windows下的ssh姐妹花 Xshell 和 Xftp
  8. java基础集合类——LinkedList 源码略读
  9. Android Studio maven-metadata.xml 卡着不动原因和解决方法
  10. 简单实现仿某宝地址选择三级联动样式