關(guān)于運行錯誤协饲,HALCON/C++默認(rèn)打印錯誤信息并且終止程序粥喜。然而在某些應(yīng)用中凸主,放寬這個法則可能更有用。比如额湘,如果一個應(yīng)用要求用戶交互式地指定一個圖像文件讀取卿吐,如果因為用戶不能拼錯文件名而終止程序的話,會很不方便锋华。因此嗡官,HALCON/C++允許集成你自己的錯誤處理代碼。如下的章節(jié)將分別介紹面向?qū)ο蟮姆椒ê兔嫦蜻^程的方法毯焕。
2.3.1 面向?qū)ο蟮姆椒?/h2>
如果一個運行錯誤發(fā)生在面向?qū)ο蟮恼{(diào)用中衍腥,類HException的實例將會創(chuàng)建。(圖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:錯誤發(fā)生的項目行號
- file:錯誤發(fā)生的文件名
- proc:實際的HALCON算子的名字
- err: 錯誤代號竹捉,see below
- message: 錯誤文本
當(dāng)發(fā)生后,HException的對象被傳遞到所謂的異常句柄擅耽。HALCON的默認(rèn)異常句柄將打印對應(yīng)的錯誤信息活孩,并且終止程序。
作為另一種可替代的方法乖仇,你可以實現(xiàn)和使用你自己的異常處理憾儒。為了作為HALCON exception handler,一個程序必須有如下的簽名:
typedef void (*Handler)(const Halcon::HException &exception);
然后通過HException的方法InstallHHandler安裝你的異常處理程序乃沙。(見圖5.8)這樣一旦發(fā)生了運行錯誤起趾,HALCON然后調(diào)用你自己的程序,傳遞實際的異常的對象作為參數(shù)警儒。
如下的例子將展示如何使用一個用戶指定的異常處理器和標(biāo)準(zhǔn)的C++異常處理機制(try catch)一起使用.對應(yīng)的項目example_errorhandle.cpp可以在%HALCONEXAMPLES%\cpp的子目錄找到训裆。它實現(xiàn)了以上指定的目的:你可以鍵入一個文件名去讀取蜀铲;如果文件不存在边琉,項目將打印一個對應(yīng)的信息但不會停止程序,而是繼續(xù)運行记劝。
項目的開始变姨,一個用戶指定的異常處理器使用如下的方法安裝:
HException::InstallHHandler(&MyHalconExceptionHandler);
被安裝的程序簡單地調(diào)用C++的異常處理機制throw:
void MyHalconExceptionHandler(const Halcon::HException& except)
{
throw except;
}
ReadImage的調(diào)用被一個try 區(qū)域封裝,一個可能的異逞岢螅可以在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類型的數(shù)據(jù)。這個數(shù)據(jù)會分為兩類:信息H_MSG_* and 錯誤 H_ESR_*.
典型地怒竿,如果沒有錯誤發(fā)生砍鸠,HALCON算子返回信息H_MSG_TRUE.
一旦遇到一個錯誤,HALCON默認(rèn)打印所謂的錯誤信息并且終止程序耕驰。你可以通過算子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;
}
請注意一些數(shù)組算子沒有返回值厚骗。這樣示启,被描述的方法會導(dǎo)致一個內(nèi)存泄漏。請使用面向?qū)ο蟮姆椒ù妗?/p>