當 Magick++ 回報錯誤時,會拋出以 *Exception* 為基底類別的物件。Magick++ 會與發生錯誤的操作同步拋出 C++ 例外。這允許在封閉程式碼(可能是處理單一影像的程式碼)內捕獲錯誤,同時允許以簡單的編碼風格編寫程式碼。
應該在任何可被視為重要工作主體的操作序列周圍放置 try/catch 區塊。例如,如果您的程式處理影像清單,並且其中一些影像可能有缺陷,則通過將 try/catch 區塊放置在處理單一影像的整個程式碼序列(包括實例化影像物件)周圍,您可以最大程度地減少錯誤檢查的開銷,同時確保建立用於處理該物件的所有物件都被安全銷毀(C++ 例外會展開堆疊直到封閉的 try 區塊,銷毀任何建立的物件)。
您的程式主迴圈的偽程式碼可能如下所示
程式中 try/catch 區塊的所需位置和數量取決於其錯誤處理的複雜程度。非常簡單的程式可能只使用一個 try/catch 區塊。
*Exception* 類別是從 C++ 標準例外類別派生的。這意味著它包含一個 C++ 字串,其中包含有關錯誤的額外資訊(例如要顯示給使用者的資訊)。通過 what() 方法訪問此字串。 例如
catch( Exception & error_ ) { cout << "Caught exception: " << error_.what() << endl; }
*Warning* 和 *Error* 類別是從 *Exception* 類別派生的。從 *Warning* 派生的例外會被拋出,以表示可能影響結果完整性或品質的非致命錯誤(例如,提供給 montage 的一個影像有缺陷)。在大多數情況下,*Warning* 例外可以通過立即捕獲、處理(例如列印診斷資訊)並繼續執行來忽略。從 *Error* 派生的例外會被拋出,以表示無法產生有效結果的致命錯誤(例如,嘗試讀取不存在的檔案)。
具體的派生例外類別如下表所示
警告子類別
警告 |
警告描述 |
WarningUndefined |
未指定的警告類型。 |
WarningBlob |
目前未使用 |
WarningCache |
目前未使用 |
WarningCoder |
某些編碼器發出的警告。 |
WarningConfigure |
目前未使用 |
WarningCorruptImage |
當確定影像已損毀時發出的警告。 |
WarningDelegate |
委託(與外部程式介面)子系統報告的警告。 |
WarningDraw |
渲染子系統報告的警告。 |
WarningFileOpen |
當圖像文件無法打開時發出的警告(權限問題、錯誤的文件類型或文件不存在)。 |
WarningImage |
目前未使用 |
WarningMissingDelegate |
目前未使用 |
WarningModule |
目前未使用 |
WarningMonitor |
目前未使用 |
WarningOption |
當選項格式錯誤或超出範圍時發出的警告。 |
WarningRegistry |
目前未使用 |
WarningResourceLimit |
當程式資源耗盡時發出的警告(例如:内存不足)。 |
WarningStream |
目前未使用 |
WarningType |
目前未使用 |
WarningXServer |
由 X11 子系統發出的警告。 |
錯誤子類別
錯誤 |
錯誤描述 |
ErrorUndefined |
未指定的錯誤類型。 |
ErrorBlob |
由 BLOB I/O 子系統發出的錯誤。 |
ErrorCache |
由像素缓存子系統發出的錯誤。 |
ErrorCoder |
由編碼器(圖像格式支持)發出的錯誤。 |
ErrorConfigure |
載入配置文件時發生的錯誤。 |
ErrorCorruptImage |
當圖像文件損壞時發出的錯誤。 |
ErrorDelegate |
由委託(與外部程式介面)子系統發出的錯誤。 |
ErrorDraw |
在圖像上繪圖時發生的錯誤。 |
ErrorFileOpen |
當圖像文件無法打開時發出的錯誤。 |
ErrorImage |
繪圖時發生的錯誤。 |
ErrorMissingDelegate |
當需要附加元件庫或程式才能支持請求的操作時發出的錯誤。 |
ErrorModule |
由模組載入器子系統發出的錯誤。 |
ErrorMonitor |
目前未使用 |
ErrorOption |
當選項格式錯誤或超出範圍時發出的錯誤。 |
ErrorRegistry |
由圖像/BLOB 註冊表子系統發出的錯誤。 |
ErrorResourceLimit |
當程式資源耗盡時發出的錯誤(例如:内存不足)。 |
ErrorStream |
由像素流子系統發出的錯誤。 |
ErrorType |
由字體渲染子系統發出的錯誤。 |
ErrorXServer |
由 X11 子系統發出的錯誤。 |