美文网首页
2.3 错误处理

2.3 错误处理

作者: 厦门听涛 | 来源:发表于2016-08-31 22:48 被阅读0次

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

    2.3.1 面向对象的方法

    如果一个运行错误发生在面向对象的调用中,类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;
    }
    

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

    相关文章

      网友评论

          本文标题:2.3 错误处理

          本文链接:https://www.haomeiwen.com/subject/kzrcettx.html