注:以下材料来自halcon帮助文档,因水平有限,难免有误,欢迎指正。
0 概述
在遇到一个运行时错误时,HALCON(C++)会以默认的方式给出错误信息,并终止程序。然而,在某些情况下,我们并不希望按照这样的规则来处理错误。例如。当一个程序允许用户交互性地读取一个文件的时候,如果用户输入了错误的文件名,我们希望能终止程序运行。所以,HALCON(C++)允许我们完善自己的错误处理方式。下面是halcon给出的两种处理方式。
1 面向对象的处理方式
如果一个错误发生在一个面向对象的函数调用中,系统会自动生成一个HException类的实例,这个实例包含了错误的所有信息,一个exception的成员包括:
line:错误发生的代码行号
file:错误发生的文件名
proc:HALCON函数名
err:错误代号
message:错误信息
以上信息生成后会被传递到所谓的exception handler,HALCON的默认exception handler会打印出这个错误信息,并终止程序。作为一个选择方案,我们可以执行和使用自己的exception handler。要充当一个HALCON的exception handler,一个程序必须要有以下的签名:
我们通过HException类的方式来安置我们的exception handler程序,参考如下:
为了避免运行时错误,HALCON会调用我们的程序,通过一个参数的形式传递一个实际exception实例。下面一个例子展示了怎样结合标准C++ exception处理机制(try...catch)来使用一个用户指定的exception handler。它主要实现功能:用户指定要被读取的文件,如果一个文件不存在,程序会打印出错误信息,但是可以继续运行。
在程序的开头处,一个用户指定的exception handler是用以下这句代码来植入:
以上这个代码只是简单的通过throw把exception对象传递给C++ exception处理机制:
那么,对ReadImage函数的调用就会被压入一个try block,一个有可能随后发生的exception就会在一个对应的catch block里面执行:
2 面向过程的处理方式
在面向过程的方式里,函数调用会返回一个Herror类型的值,这个值可以分成两类:信息类H_MSG_*和错误类H_ERR_*。一般地,如果没有发生错误,HALCON函数会返回信息H_MSG_TRUE。遇到一个错误时,HALCON会默认地打印对应的错误信息并终止程序。我们可以通过调用函数set_check来使无效(或激活)这个响应行为。还是上面读取文件的例子,如果遇到一个错误,它会打印响应的错误信息,这个信息可以通过函数get_error_text来获得。
要注意的是一些tuple类型的函数并没有返回值,那么这种错误处理方式会导致内存泄漏,在这种情况下应该使用面向对象的方式来处理。