ToolTalk ユーザーズガイド

第 14 章 エラー処理

ToolTalk サービスはエラー状態をグローバル変数ではなく、関数の戻り値で返します。ToolTalk 関数は、次のいずれかのエラー値を返します。

返される型はそれぞれエラーが発生したかどうかを判定するために、異なる処理をされます。たとえば、tt_default_session_set の戻り値は Tt_status コードです。ToolTalk サービスは、指定された sessid にデフォルトセッションを設定します。

ToolTalk エラー状態の検索

エラー値の検索には、表 14–1 に示す ToolTalk エラー処理関数を使用できます。

表 14–1 ToolTalk エラー状態の検索

ToolTalk 関数 

説明 

tt_pointer_error(char * return_val)

ポインタ内で符号化されたエラーを返す 

tt_pointer_error((void *) (p))

VOID * にキャストされたポインタ内で符号化されたエラーを返す

tt_int_error(int return_val)

整数内で符号化されたエラーを返す 

これらの関数の返される型は、Tt_status です。

ToolTalk エラー状態の確認

エラー値を確認するには、表 14–2 に示す ToolTalk エラーマクロを使用できます。

表 14–2 ToolTalk エラーマクロ

返される型 

ToolTalk マクロ 

展開 

Tt_status

tt_is_err(status_code)

(TT_WRN_LAST < (status_code))

戻り値の状態

通常の戻り値を持つ関数と持たない関数の戻り値の状態について次に説明します。

通常の戻り値を伴う関数

ToolTalk 関数がポインタまたは整数などの通常の戻り値を持つ場合は、実際の値の代わりに特別な「エラー値」が返されます。

通常の戻り値を伴わない関数

ToolTalk 関数が通常の戻り値を持たない場合、戻り値は「列挙」型 Tt_status の要素です。

エラーがあるかどうかを確認するには、整数を返す ToolTalk マクロ tt_is_err を使用します。

エラーがある場合は、例 14–1 に示すように tt_status_message 関数を使用して、Tt_status コードを説明する文字列を取得できます。


例 14–1 エラー説明の取得

char *spec_id, my_application_name;
Tt_status tterr;

tterr = tt_spec_write(spec_id);
if (tt_is_err(tterr)) {
	fprintf(stderr, “%s: %s\n”, my_application_name,
		tt_status_message(tterr));
}


返されたポインタの状態

ポインタを返す ToolTalk 関数の実行中にエラーが発生すると、ToolTalk サービスは、正しい Tt_status コードを示す ToolTalk API ライブラリ内のアドレスを与えます。ポインタが有効かどうかを確認するには、ToolTalk マクロの tt_ptr_error を使用できます。ポインタがエラー値の場合は、tt_status_message を使用して Tt_status 文字列を取得できます。

例 14–2 では、エラー値が発見された場合、ポインタを確認し、Tt_status 文字列を検索して出力します。


例 14–2 返されたポインタ状態の検索

char *old_spec_id, new_file, new_spec_id, my_application_name;
Tt_status tterr;

new_spec_id = tt_spec_move(old_spec_id, new_file);
tterr = tt_ptr_error(new_spec_id);
switch (tterr) {
    case TT_OK:
	/*
	 * Replace old_spec_id with new_spec_id in my internal
	 * data structures.
	 */
	update_my_spec_ids(old_spec_id, new_spec_id);
	break;
    case TT_WRN_SAME_OBJID:
	/*
	 * The spec must have stayed in the same filesystem,
	 * since ToolTalk is reusing the spec id. Do nothing.
	 */
	break;
    case TT_ERR_FILE:
    case TT_ERR_ACCESS:
    default:
	fprintf(stderr, “%s: %s\n”, my_application_name,
		tt_status_message(tterr));
	break;
}


返された整数の状態

整数を返す ToolTalk 関数の実行中にエラーが発生すると、戻り値は配信範囲外になります。値が配信範囲内にある場合、tt_int_error 関数は TT_OK の状態を返します。

値が配信範囲外かどうかを検査するには、tt_is_err マクロを使用して、エラーまたは警告が発生したかどうかを判定できます。

文字列を検索して Tt_status コードを探すには、tt_status_message を使用できます。

例 14–3 では、返された整数を確認しています。


例 14–3 返された整数の確認

Tt_message msg;
int num_args;
Tt_status tterr;
char *my_application_name;

num_args = tt_message_args_count(msg);
tterr = tt_int_error(num_args);
if (tt_is_err(tterr)) {
	fprintf(stderr, “%s: %s\n”, my_application_name,
		tt_status_message(tterr));
}


接続の異常終了

ToolTalk サービスは、ツールが予期せず終了したことをプロセスに知らせる関数を提供します。tt_message_send_on_exit 呼び出しを組み込むとき、次の 2 つのイベントのいずれか 1 つが発生するまで、ToolTalk サービスは内部でメッセージを待ち行列に入れます。

  1. プロセスが tt_close を呼び出す。

    この場合 ToolTalk サービスは、その待ち行列からメッセージを削除します。

  2. ttsession サーバーとプロセスとの接続が壊された。たとえば、アプリケーションがクラッシュした場合などです。

    この場合 ToolTalk サービスは、待ち行列に入れられたメッセージとパターンを照合し、メッセージを終了前に通常送信するのと同じ方法で配信します。

プロセスは tt_close を呼び出す前に tt_message_send を呼び出すことによって、正常終了のメッセージを送信することもできます。この場合、プロセスがその正常終了メッセージを送信しても、tt_close を呼び出す前にクラッシュすると、ToolTalk サービスは、正常終了メッセージと tt_message_send_on_exit メッセージの両方を対象のプロセスに配信します。

エラーの伝達

ポインタを受け付ける ToolTalk 関数は、ポインタがエラー値の場合、渡されるポインタを常に確認してから TT_ERR_POINTER を返します。この確認によって、どの呼び出しに対してもポインタの値を確認しないで、妥当な方法で呼び出しを結合することが可能になります。

例 14–4 では、メッセージが作成され、埋め込まれ、送信されます。tt_message_create が異常終了すると、エラーオブジェクトが「m」に代入され、すべての tt_message_xxx_set 呼び出しと tt_message_send 呼び出しが異常終了します。各呼び出しの間で検査を行わないでエラーを検出するには、tt_message_send からのリターンコードを検査します。


例 14–4 エラーのチェック

Tt_message m;

m=tt_message_create();
tt_message_op_set(m,”OP”);
tt_message_address_set(m,TT_PROCEDURE);
tt_message_scope_set(m,TT_SESSION);
tt_message_class_set(m,TT_NOTICE);
tt_rc=tt_message_send(m);
if (tt_rc!=TT_OK)...