從Imatest IT 4.2 版本開始,引入了異常層級結構,旨在為 API 使用者提供更完善的錯誤處理方法。本頁面旨在作為Imatest 可能拋出的異常及其在Imatest IT/DLL中處理方式的參考。
異常層次結構
下表顯示了 Imatest 定義的異常層次結構。表中,縮排越深表示該異常繼承自其上方縮排越淺的異常。請注意, Imatest IT函式庫也可能會拋出由底層 MATLAB 程式產生的例外。 Imatest IT提供了區分Imatest 異常和 MATLAB 異常所需的功能。
我們的函式庫拋出的所有例外都是mwException類別的實例,mwException 是一個 MATLAB 類,它繼承自std::exception 。
異常名稱 | 筆記 |
|---|---|
ImatestException | Imatest 所有異常的基底類別。 |
配置異常 | 處理與 Imatest 無效配置相關的錯誤的例外情況,例如提供的 INI 檔案包含無效條目。 |
數據異常 | 這是針對 Imatest 資料物件出現問題而要拋出的例外。 |
資料構造異常 | 這是當 Imatest 資料物件的建構子出現問題時要拋出的異常。 |
影像分析異常 | 但因使用者提供的圖片來源問題導致的錯誤除外。 |
自動檢測異常 | 與自動檢測演算法相關的錯誤除外。 |
作物異常 | 因影像裁切不當造成的一般性錯誤除外。 |
檢測異常 | 此例外情況適用於 Imatest 特徵檢測演算法中發生的錯誤。 |
RoiFailureException | 如果 ROI 出現問題,例如偵測到的邊緣太靠近 ROI 的兩端,則會出現錯誤,但這種情況除外。 |
| ImageSourceException | 但因使用者提供的圖片來源問題導致的錯誤除外。 |
錯誤框架異常 | 但也有例外情況,例如影像中的測試圖表沒有與相機正確對齊,或者換句話說,沒有正確構圖。 |
影像擷取異常 | 影像擷取介面(例如 Android 或 Omnivision API 函數)所造成的錯誤例外情況。 |
影像異常 | 影像檔案(而非視訊檔案)特有的錯誤除外。 |
BadImageSizeException | 但當影像尺寸太小而無法進行分析時,則不適用此例外情況。 |
EmptyImageException | 但也有例外情況,即本應有一個圖像數組可供分析,但卻檢測到了一個空的圖像數組。 |
不支援的格式異常 | 當提供不支援的圖像或視訊格式時,會出現例外情況。 |
視訊異常 | 視訊檔案相關的常見錯誤除外。 |
ImatestIOException | I/O 一般問題的例外。 |
ImatestCannotOpenFileException | 當 Imatest 無法開啟檔案時,即因找不到檔案以外的其他原因而無法取得讀取或寫入權限時,則會出現例外情況。 |
ImatestFileNotFoundException | 當找不到指定檔案時,會拋出一個異常。 |
ImatestSocketException | 套接字通訊出錯時拋出的異常。 |
| LicenseException | 與呼叫第三方授權庫或系統相關的外部錯誤除外,例如,呼叫 Nalpeiron 函式庫傳回錯誤代碼。 |
| 輸出異常 | 但對於提供給使用者的輸出相關的錯誤,例如圖表或文字輸出中的錯誤,則不予受理。 |
JsonException | 讀取或寫入 JSON 檔案時出錯的異常。 |
繪圖異常 | Imatest 向使用者輸出的圖表中出現錯誤時,會進行例外處理。 |
XmlException | 讀取或寫入 XML 檔案時出錯的異常。 |
參數異常 | 函數參數相關錯誤除外。 |
輸入錯誤異常 | 當向函數提供的輸入數量不正確時,會拋出異常。 |
| 輸出數量錯誤異常 | 當傳遞給函數的輸出數量不正確時,會發生異常。 |
| 輸入格式異常 | 例外情況是輸入參數格式不正確(長度錯誤等)所導致的錯誤。 |
| 輸入類型錯誤異常 | 輸入參數類型或類別錯誤導致的錯誤除外。 |
UIException | 使用者介面相關的常規錯誤除外。 |
用戶取消例外 | 當使用者點擊取消按鈕時可能拋出的異常。 |
函數原型和其他庫資源
由於mwException類別沒有用於指示異常的成員,因此Imatest IT庫中包含了一個函數,用於檢索上次拋出的異常的標識符。 getExceptionID() 函數應該在 catch 程式碼區塊中呼叫(請參閱下面的範例)。
| getExceptionID (int nargout , mwArray& errID, mwArray& errName ) | 呼叫此函數以檢索最後一個異常的標識符和名稱。 |
errID參數是一個 mwArray 類型,它是 MATLAB 陣列類,包含一個有符號整數,用於識別異常。 errName 包含一個字串,表示異常的名稱。輸入參數nargout 的值應為 2。
Imatest IT庫中包含一個額外的頭檔( imatest_exception_IDs.h ),其中包含Imatest異常層次結構的枚舉和 const char* 識別碼聲明。 imatest_exception_IDs.h 中定義的值與getExceptionID ()傳回的值相對應。
例如:如何確定異常類型
為了區分 Imatest 異常和 Matlab 異常,您需要使用`getExceptionID` 函數來取得異常識別碼。 Imatest 異常的完整識別碼清單定義在Imatest IT隨附的`imatest_exception_IDs.h`頭檔中。以下範例展示如何取得異常標識符:
try {
// call an Imatest library function ...
} catch(mwException& mwe) {
std::cout << "Error!" << std::endl;
std::cout << mwe.what() << std::endl;
mwe.print_stack_trace(); // print the stack trace to std::cerr
mwArray errName, errID;
getExceptionID(2, errID, errName);
std::string exceptName((const char*)errName.ToString());
int exceptID = errID.Get(1,1);
// Handle exceptions using definitions in imatest_exception_IDs.h...
} catch(const std::exception& ex) {
// Handle exceptions ...
}相關 INI 文件設置
Imatest INI 檔案的[api]部分新增了continue_on_error鍵。 continue_on_error 可用來抑制在Imatest IT中批次處理影像時可能出現的異常。當 continue_on_error設定為 1 時,將抑制異常;當設定為 0 時,允許拋出異常。更多資訊請參閱:影響 Imatest IT 的參數。