Magick::Exception 類別

當 Magick++ 回報錯誤時,會拋出以 *Exception* 為基底類別的物件。Magick++ 會與發生錯誤的操作同步拋出 C++ 例外。這允許在封閉程式碼(可能是處理單一影像的程式碼)內捕獲錯誤,同時允許以簡單的編碼風格編寫程式碼。

應該在任何可被視為重要工作主體的操作序列周圍放置 try/catch 區塊。例如,如果您的程式處理影像清單,並且其中一些影像可能有缺陷,則通過將 try/catch 區塊放置在處理單一影像的整個程式碼序列(包括實例化影像物件)周圍,您可以最大程度地減少錯誤檢查的開銷,同時確保建立用於處理該物件的所有物件都被安全銷毀(C++ 例外會展開堆疊直到封閉的 try 區塊,銷毀任何建立的物件)。

您的程式主迴圈的偽程式碼可能如下所示

using namespace std; for infile in list { try { // 首先構造一個影像實例,這樣我們就不必擔心 // 由於拋出輕微警告例外而導致物件構造失敗。 Magick::Image image; try { // 嘗試讀取影像檔案 image.read(infile); } catch( Magick::WarningCoder &warning ) { // 處理載入檔案時的編碼器警告(例如 TIFF 警告) // 也許使用者會對這些警告感興趣(或不感興趣)。 // 如果在載入影像時產生警告,影像 // 通常仍然可以使用(但如果警告是關於 // 重要的事情則不行!) cerr << "編碼器警告:" << warning.what() << endl; } catch( Magick::Warning &warning ) { // 處理任何其他 Magick++ 警告。 cerr << "警告:" << warning.what() << endl; } catch( Magick::ErrorFileOpen &error ) { // 處理 Magick++ 檔案開啟錯誤 cerr << "錯誤:" << error.what() << endl; continue; // 嘗試下一個影像。 } try { image.rotate(90); image.write("outfile"); } catch ( MagickExeption & error) { // 處理旋轉或寫入 outfile 時的問題。 cerr << "捕獲到 Magick++ 例外:" << error.what() << endl; } } catch( std::exception & error ) { // 處理從標準 C++ 例外派生的任何其他例外 cerr << "捕獲到 C++ STD 例外:" << error.what() << endl; } catch( ... ) { // 處理*任何*例外(最後的手段)。這裡沒有太多 // 您可以做的事情,只能重試失敗的操作,或者退出 } }

程式中 try/catch 區塊的所需位置和數量取決於其錯誤處理的複雜程度。非常簡單的程式可能只使用一個 try/catch 區塊。

*Exception* 類別是從 C++ 標準例外類別派生的。這意味著它包含一個 C++ 字串,其中包含有關錯誤的額外資訊(例如要顯示給使用者的資訊)。通過 what() 方法訪問此字串。 例如

catch( Exception & error_ ) 
    { 
      cout << "Caught exception: " << error_.what() << endl; 
    }

*Warning* 和 *Error* 類別是從 *Exception* 類別派生的。從 *Warning* 派生的例外會被拋出,以表示可能影響結果完整性或品質的非致命錯誤(例如,提供給 montage 的一個影像有缺陷)。在大多數情況下,*Warning* 例外可以通過立即捕獲、處理(例如列印診斷資訊)並繼續執行來忽略。從 *Error* 派生的例外會被拋出,以表示無法產生有效結果的致命錯誤(例如,嘗試讀取不存在的檔案)。

具體的派生例外類別如下表所示

警告子類別


錯誤子類別