__set_exception_handler() - 例外ハンドラー・ルーチンの登録

標準

標準/拡張機能 C/C++ 依存項目
  両方  

形式

#include <__le_api.h>

int  __set_exception_handler( void(*exception_handler) (struct __cib *, void *),
                              void * user_data);

機能説明

制約事項: この関数は AMODE 64 でのみ有効です。
現行スタック・フレーム用に「例外ハンドラー」を登録する標準外関数。 例外ハンドラーは、スレッド・レベルで「例外」を処理するために使用され ます (プロセス・レベルでシグナルを処理するシグナル・キャッチャーとは異なります)。
パラメーター
説明
exception_handle
「例外ハンドラー」関数と関連付けられた関数記述子のアドレス。
user_data
「例外ハンドラー」関数に渡されるユーザー定義可能なトークン。

例外ハンドラーは、以下の条件に対して呼び出されます。

表 1. 呼び出される例外ハンドラー
例外 フィードバック・コード メッセージ番号 結果のシグナル
操作 CEE341 CEE3201S SIGILL
特権操作 CEE342 CEE3202S SIGILL
実行 CEE343 CEE3203S SIGILL
保護 CEE344 CEE3204S SIGSEGV
アドレッシング CEE345 CEE3205S SIGSEGV
指定 CEE346 CEE3206S SIGILL
データ CEE347 CEE3207S SIGFPE
固定小数点オーバーフロー
注: C/C++ アプリケーションでは処理されない。
CEE348 CEE3208S SIGFPE
固定小数点ゼロ除算 CEE349 CEE3209S SIGFPE
10 進数オーバーフロー例外 CEE34A CEE3210S SIGFPE
10 進数ゼロ除算 CEE34B CEE3211S SIGFPE
指数オーバーフロー CEE34C CEE3212S SIGFPE
指数アンダーフロー
注: C/C++ アプリケーションでは処理されない。
CEE34D CEE3213S SIGFPE
重み
注: C/C++ アプリケーションでは処理されない。
CEE34E CEE3214S SIGFPE
浮動小数点ゼロ除算 CEE34F CEE3215S SIGFPE
IEEE 2 進数浮動小数点不正確 (切り捨て) CEE34G CEE3216S SIGFPE
IEEE 2 進数浮動小数点不正確 (切り上げ) CEE34H CEE3217S SIGFPE
IEEE 2 進数浮動小数点指数アンダーフロー CEE34I CEE3218S SIGFPE
IEEE 2 進数浮動小数点指数アンダーフロー不正確 (切り捨て) CEE34J CEE3219S SIGFPE
IEEE 2 進数浮動小数点指数アンダーフロー不正確 (切り上げ) CEE34K CEE3220S SIGFPE
IEEE 2 進数浮動小数点指数オーバーフロー CEE34L CEE3221S SIGFPE
IEEE 2 進数浮動小数点指数オーバーフロー不正確 (切り捨て) CEE34M CEE3222S SIGFPE
IEEE 2 進数浮動小数点指数オーバーフロー不正確 (切り上げ) CEE34N CEE3223S SIGFPE
IEEE 2 進数浮動小数点ゼロ除算 CEE34O CEE3224S SIGFPE
IEEE 2 進数浮動小数点無効操作 CEE34P CEE3225S SIGFPE
比較およびデータ例外のトラップ CEE352 CEE3234S SIGFPE
IEEE 無効操作のベクトル処理例外 CEE354 CEE3236S SIGFPE
IEEE ゼロ区切りのベクトル処理例外 CEE355 CEE3237S SIGFPE
IEEE 指数オーバーフローのベクトル処理例外 CEE356 CEE3238S SIGFPE
IEEE 指数アンダーフローのベクトル処理例外 CEE357 CEE3239S SIGFPE
IEEE 不正確のベクトル処理例外 CEE358 CEE3240S SIGFPE
再試行可能異常終了 CEE35I CEE3250C SIGABND
登録された例外ハンドラーがある特定のスレッドについて上記リストに含まれる 例外の 1 つが発生すると、Language Environment® は、以下の構文を使って該当のハンドラーを呼 び出します。
void  exception_handler(struct __cib * cib, void * user_data);
パラメーター
説明
cib
Language Environment 条件情報ブロック (CIB) のアドレス。
user_data
例外ハンドラーが登録されたときに指定されたユーザー定義可能トークン。
例外ハンドラーを Language Environment に戻してはなりません。 例外ハンドラーは、pthread_exit() でスレッドを終了させるか、exit() でプロセスを 終了させるか、setjmp() と longjmp() で、事前定義ポイントで実行を再開する必要があります。 例外ハンドラーを Language Environment に戻すと、スレッドは異常終了します。
  • POSIX 環境では、スレッドのみが異常終了し、スレッド出口状況は -1 に設定 されます。 次と同等です。
    pthread_exit( (void *) -1);
  • POSIX 以外の環境では、Language Environment 全体 (プロセスとスレッド) が異 常終了します。 次と同等です。
    exit(-1);

戻り値

正常に実行されると、__set_exception_handler() は 0 を戻します。正常に実行 されなかった場合、-1 が戻されて、errno はエラーを示すように設定されます。 errno が取る値は次のとおりです。
  • EINVAL - 例外ハンドラーが無効です。

アプリケーションの使用法

  1. 1 つのスタック・フレームに対して複数の例外ハンドラーを登録することはで きません。 最後に登録された例外ハンドラーが実行されます。
  2. 例外ハンドラーをネストすることができますが、異なるスタック・フレーム上 になければなりません。
  3. 例外ハンドラーは、いったん登録されると、ネストされた関数へのすべての呼び 出しが存続中はアクティブのままであり、__set_exception_handler() への呼び出しが 起動されたスタック・フレームからフローが戻ったら、自動的に登録抹消されます。
  4. いずれかの例外ハンドラーが登録されていると、そのハンドラーは、ネストさ れた関数の 1 つが別の例外ハンドラーを登録するまで、後続の関数呼び出し (ネスト された関数呼び出し) の存続中はアクティブのままです。 別のハンドラーが登録されると、最初の例外ハンドラーは中断されます。
  5. 例外ハンドラーは、longjmp()が、その例外ハンドラーが登録されたフレーム より前のスタック上のスタック・フレームに戻ったとき、自動的に登録解除されます。 longjmp() の結果として全探索されたスタック・フレームに関連付けられている例外ハンドラーはすべて、自動的に登録抹消されます。
  6. 例外ハンドラーは、制御を渡されると、使用不可になります。 他のどの例外ハンドラー (前に登録済みの可能性があっても) もアクティブに設定 されません。 つまり、例外ハンドラーが制御を渡されるとき、アクティブになっている例外ハン ドラーはありません。 アクティブになっている例外ハンドラーは中断されます。
    • 例外ハンドラーの実行中に発生する例外はすべて、例外ハンドラーがないとき に Language Environment が例外を処理するのと同じ方法で処理されます。
    • 例外ハンドラーがその実行中に発生する例外を扱えることが必要な場合、その 例外ハンドラーは、__set_exception_handler() を呼び出して、別の例外ハンドラーを 登録 (または同じ例外ハンドラーを再登録) しなければなりません。
  7. 条件に対して 1 つの、そして唯一の例外ハンドラーが起動されます (条件 (ま たは例外) が発生したスタック・フレームに対してアクティブなハンドラー)。
  8. 例外ハンドラーが存在していて、条件が上記リストの中の 1 つであるとき、 標準の Language Environment 条件処理のすべてが迂回されます ((POSIX(ON) のとき、例外 のシグナルへのマッピングを含みます)。 その代わりに、そのアクティブの例外ハンドラーが制御を渡され、それが、その例 外を「処理する」機会を 1 回、持ちます。 そのハンドラーが例外を処理しない場合、異常終了が起こります。
  9. シグナルの処理に影響を与えるために使用される関数は、例外ハンドラーの処理 に影響を与えません。 すなわち、SIGABND、SIGFPE、SIGILL、または SIGSEGV をブロッキングまたは無視 しても、例外ハンドラーの制御取得が妨害されることはありません。
  10. 例外ハンドラーが稼働するためには、Language Environment の「TRAP」ランタイ ム・オプションはオンに設定されている必要があります (すなわち、TRAP(ON) また は TRAP(ON, NOSPIE))。

関連情報