Magick::Exception クラス

Exception は、Magick++ がエラーを報告した際にスローされるオブジェクトの基底クラスを表します。 Magick++ は、エラーが発生した操作と同期して C++ 例外をスローします。 これにより、エラーを囲むコード (おそらく単一の画像を処理するコード) 内でトラップできます。同時に、シンプルなコーディングスタイルでコードを記述できます。

try/catch ブロックは、重要な作業の本体と見なせる一連の操作を囲む必要があります。 たとえば、プログラムが画像のリストを処理し、これらの画像の一部に欠陥がある可能性がある場合、1 つの画像を処理するコード全体 (画像オブジェクトのインスタンス化を含む) を try/catch ブロックで囲むことで、エラーチェックのオーバーヘッドを最小限に抑えながら、そのオブジェクトを処理するために作成されたすべてのオブジェクトが安全に破棄されるようにすることができます (C++ 例外は、囲む try ブロックまでスタックを巻き戻し、作成されたオブジェクトを破棄します)。

プログラムのメインループの擬似コードは次のようになります

using namespace std; for (auto& infile : 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 ( Magick::Exception & error) { // outfile の回転または書き込み中の問題を処理します。 cerr << "Magick++ 例外をキャッチしました: " << error.what() << endl; } } catch( std::exception & error ) { // 標準 C++ 例外から派生したその他の例外を処理します cerr << "C++ STD 例外をキャッチしました: " << error.what() << endl; } catch( ... ) { // *任意の* 例外を処理します (最後の手段)。 失敗した操作を再試行するか、 // 終了する以外にできることはあまりありません。 } }

プログラムに必要な try/catch ブロックの場所と数は、エラー処理の高度さによって異なります。 非常に単純なプログラムでは、try/catch ブロックを 1 つだけ使用する場合があります。

Exception クラスは、C++ 標準例外クラスから派生しています。 つまり、エラーに関する追加情報 (例: ユーザーに表示する) を含む C++ 文字列が含まれています。 what() メソッドを使用してこの文字列にアクセスします。 例:

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

Warning クラスと Error クラスは、Exception クラスから派生しています。 Warning から派生した例外は、結果の完全性または品質に影響を与える可能性のある致命的でないエラーを表すためにスローされます (例: montage に引数として提供された 1 つの画像に欠陥がある)。 ほとんどの場合、Warning 例外は、すぐにキャッチして処理し (例: 診断を出力)、続行することで無視できます。 Error から派生した例外は、有効な結果を生成できない致命的なエラーを表すためにスローされます (例: 存在しないファイルを読み取ろうとした場合)。

具体的な派生例外クラスは、次の表に示されています。

警告サブクラス


画像/ BLOBレジストリサブシステムによって報告された警告