halcon/c++接口基础 之异常处理
關(guān)于運(yùn)行錯(cuò)誤,HALCON/C++默認(rèn)打印錯(cuò)誤信息并且終止程序。然而在某些應(yīng)用中,放寬這個(gè)法則可能更有用。比如,如果一個(gè)應(yīng)用要求用戶交互式地指定一個(gè)圖像文件讀取,如果因?yàn)橛脩舨荒芷村e(cuò)文件名而終止程序的話,會(huì)很不方便。因此,HALCON/C++允許集成你自己的錯(cuò)誤處理代碼。如下的章節(jié)將分別介紹面向?qū)ο蟮姆椒ê兔嫦蜻^(guò)程的方法。
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.
以上這個(gè)例子,包含了錯(cuò)誤的所有信息。其中一個(gè)異常重要的成員如下:
- line:錯(cuò)誤發(fā)生的項(xiàng)目行號(hào)
- file:錯(cuò)誤發(fā)生的文件名
- proc:實(shí)際的HALCON算子的名字
- err: 錯(cuò)誤代號(hào),see below
- message: 錯(cuò)誤文本
當(dāng)發(fā)生后,HException的對(duì)象被傳遞到所謂的異常句柄。HALCON的默認(rèn)異常句柄將打印對(duì)應(yīng)的錯(cuò)誤信息,并且終止程序。
作為另一種可替代的方法,你可以實(shí)現(xiàn)和使用你自己的異常處理。為了作為HALCON exception handler,一個(gè)程序必須有如下的簽名:
typedef void (*Handler)(const Halcon::HException &exception);然后通過(guò)HException的方法InstallHHandler安裝你的異常處理程序。(見圖5.8)這樣一旦發(fā)生了運(yùn)行錯(cuò)誤,HALCON然后調(diào)用你自己的程序,傳遞實(shí)際的異常的對(duì)象作為參數(shù)。
如下的例子將展示如何使用一個(gè)用戶指定的異常處理器和標(biāo)準(zhǔn)的C++異常處理機(jī)制(try catch)一起使用.對(duì)應(yīng)的項(xiàng)目example_errorhandle.cpp可以在%HALCONEXAMPLES%\cpp的子目錄找到。它實(shí)現(xiàn)了以上指定的目的:你可以鍵入一個(gè)文件名去讀取;如果文件不存在,項(xiàng)目將打印一個(gè)對(duì)應(yīng)的信息但不會(huì)停止程序,而是繼續(xù)運(yùn)行。
項(xiàng)目的開始,一個(gè)用戶指定的異常處理器使用如下的方法安裝:
HException::InstallHHandler(&MyHalconExceptionHandler);被安裝的程序簡(jiǎn)單地調(diào)用C++的異常處理機(jī)制throw:
void MyHalconExceptionHandler(const Halcon::HException& except) {throw except; }ReadImage的調(diào)用被一個(gè)try 區(qū)域封裝,一個(gè)可能的異??梢栽赾atch中捕獲:
Herror error_num; try {image = HImage::ReadImage(filename); } catch (HException &except) {error_num = except.err;return error_num; } return H_MSG_TRUE;面向過(guò)程的方法
正如section “Calling HALCON Operators”中看到的那樣,面向過(guò)程的方法返回一個(gè)Herror類型的數(shù)據(jù)。這個(gè)數(shù)據(jù)會(huì)分為兩類:信息H_MSG_* and 錯(cuò)誤 H_ESR_*.
典型地,如果沒(méi)有錯(cuò)誤發(fā)生,HALCON算子返回信息H_MSG_TRUE.
一旦遇到一個(gè)錯(cuò)誤,HALCON默認(rèn)打印所謂的錯(cuò)誤信息并且終止程序。你可以通過(guò)算子set_check指定異常是否忽略。如下的例子代碼檢測(cè)一個(gè)文件是否正確打開;一旦遇到錯(cuò)誤,將打印所謂的錯(cuò)誤信息,可以通過(guò)get_error_text獲得錯(cuò)誤信息。
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; }請(qǐng)注意一些數(shù)組算子沒(méi)有返回值。這樣,被描述的方法會(huì)導(dǎo)致一個(gè)內(nèi)存泄漏。請(qǐng)使用面向?qū)ο蟮姆椒ù妗?/p>
總結(jié)
以上是生活随笔為你收集整理的halcon/c++接口基础 之异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Unity组件脚本的常用类和结构体Gam
- 下一篇: ad17编辑界面怎么检查未连线_软件账务