關于運行錯誤,HALCON/C++默認打印錯誤信息并且終止程序。然而在某些應用中,放寬這個法則可能更有用。比如,如果一個應用要求用戶交互式地指定一個圖像文件讀取,如果因為用戶不能拼錯文件名而終止程序的話,會很不方便。因此,HALCON/C++允許集成你自己的錯誤處理代碼。如下的章節將分別介紹面向對象的方法和面向過程的方法。
面向對象的方法
如果一個運行錯誤發生在面向對象的調用中,類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;
}
請注意一些數組算子沒有返回值。這樣,被描述的方法會導致一個內存泄漏。請使用面向對象的方法代替。
