
このコースの前半では、TRY、CATCH、および ENDTRY 命令を使用したエラー処理について確認しました。TRY 文の後に、エラーの原因となる可能性のある文が出力されます。エラーが発生すると、CATCH 命令にジャンプしてその内容が処理されます。どのような場合でも、このメソッドは ENDTRY 命令の後の処理を実行します。

TRY…ENDTRY ブロックには、複数の CATCH 命令を含めることができます。これにより、さまざまな例外を異なる方法で処理することができます。

1 つの CATCH 命令に複数の例外を一覧表示することができます。この例では、cx_sy_arithmetic_error または cx_sy_zerodivide がトリガされると、同じ CATCH ブロックが処理されます。

CATCH 命令でクラスを一覧表示すると、そのクラスまたはそのサブクラスの 1 つで例外がトリガされると、対応するブロックが処理されます。この例では、cx_sy_arithmetic_error は cx_sy_arithmetic_overflow と cx_sy_zerodivide の両方のスーパークラスです。いずれかのサブクラスのタイプの例外が発生すると、ブロックが処理されます。

すべての例外クラスは、最上位のスーパークラスがクラス cx_root である継承階層の一部です。すでに説明したように、CATCH 命令でスーパークラスを使用すると、そのサブクラスのいずれかのタイプを持つ例外がトリガされると、スーパークラスにジャンプします。すべての例外クラスは cx_root のサブクラスであるため、例外を捕捉するには CATCH cx_root 命令で十分です。
CATCH 命令の順序

CATCH 命令を記述するときは、最も具体的なクラス (複数可) を最初に配置し、最も一般的なクラスを最後に配置する必要があります。スーパークラスをそのサブクラスの 1 つ上に置くと、構文エラーが発生します。これは、特定の CATCH ブロックがより一般的なブロックによってオーバーシャドウされているため、処理できなかったためです。
INTO オプション
各例外は、オブジェクトによって表されます。このオブジェクトは、参照変数に配置して使用することができます。たとえば、この例に示すように、get_text( ) メソッドを使用して例外クラスからエラーテキストを取得することができます。

CATCH 命令でインライン宣言を使用して、参照変数が正しいデータ型で宣言されるようにすることができます。
例外オブジェクトを使用する最も一般的な方法は、get_text( ) メソッドを呼び出すことです。ただし、例外オブジェクトは、エラーの処理に役立つ他の属性とメソッドを持つことができます。

例外クラスには、何がうまくいかなかったかをより正確に説明する属性を含めることができます。これらの属性は、多くの場合、メッセージのプレースホルダを入力するために使用されます。例外クラスのパブリックセクションで、属性を適切な名称およびタイプで定義します。
例外が発生したときに属性を入力するには、例外クラスのコンストラクタの対応するインポートパラメータが必要です。このインポートパラメータは、クイックフィックスを使用して生成することができます。メソッド名 constructor にカーソルを合わせ、Ctrl + 1 を押します。クイックフィックスコンストラクタを再生成を選択します。
例外の伝播

メソッドは、呼出チェーンに沿って例外を伝播することができます。CATCH 命令を使用して例外を処理するのではなく、メソッドの定義に RAISING 句を含めます。これは、メソッドの呼出元に例外を渡すことができることを示します。
例外が呼出チェーンのどこにも捕捉されない場合は、実行時エラーが発生します。
属性 previous
場合によっては、呼び出しチェーン内でメソッドが例外を捕捉し、応答として、独自の呼び出し元が捕捉するために別の例外を発生させます。これは、たとえば、アプリケーションが処理するには技術指向すぎる例外がフレームワークで発生する場合に発生することがあります。独自の例外をトリガするメソッドは、最初の例外を渡すことができます。これは、例外クラスの previous 属性を使用して行うことができます。

例外を発生させる場合、例外クラスのインスタンスをインポートパラメータ previous に渡すことができます。これにより、例外オブジェクトが新規例外に添付されます。2 番目の例外を捕捉するメソッドは、パブリック読込専用属性 previous を使用して最初の例外オブジェクトにアクセスできます。
previous はスーパークラス cx_root に実装されるため、すべての例外クラスで使用することができます。