2.3 錯誤處理

關(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>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末领舰,一起剝皮案震驚了整個濱河市夫嗓,隨后出現(xiàn)的幾起案子迟螺,更是在濱河造成了極大的恐慌,老刑警劉巖舍咖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矩父,死亡現(xiàn)場離奇詭異,居然都是意外死亡排霉,警方通過查閱死者的電腦和手機窍株,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攻柠,“玉大人球订,你說我怎么就攤上這事」迮ィ” “怎么了冒滩?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浪谴。 經(jīng)常有香客問我开睡,道長,這世上最難降的妖魔是什么苟耻? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任篇恒,我火速辦了婚禮,結(jié)果婚禮上凶杖,老公的妹妹穿的比我還像新娘婚度。我一直安慰自己,他們只是感情好官卡,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著醋虏,像睡著了一般寻咒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颈嚼,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天毛秘,我揣著相機與錄音,去河邊找鬼阻课。 笑死叫挟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的限煞。 我是一名探鬼主播抹恳,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼署驻!你這毒婦竟也來了奋献?” 一聲冷哼從身側(cè)響起健霹,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓶蚂,沒想到半個月后糖埋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡窃这,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年瞳别,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杭攻。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡祟敛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朴上,到底是詐尸還是另有隱情垒棋,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布痪宰,位于F島的核電站叼架,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衣撬。R本人自食惡果不足惜乖订,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望具练。 院中可真熱鬧乍构,春花似錦、人聲如沸扛点。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陵究。三九已至眠饮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铜邮,已是汗流浹背仪召。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留松蒜,地道東北人扔茅。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像秸苗,于是被迫代替她去往敵國和親召娜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容