公開日: 04/01/2021

例外のスローとキャッチ

Throw()関数を実行することにより、そのスクリプト自体を停止できます。スクリプトがエラー状態に入ってしまったときにその部分から抜け出すためには、Try()関数でそのスクリプトを囲んでおきます。

Try()関数は、2つの式を引数としてとります。Try関数はまず1つ目の式を評価します。1つ目の式がThrow()の評価によって例外を戻したときは、次を実行します。

1. 評価をそこですぐに停止する。

2. 何も戻さない。

3. 2番目の式を評価する。

Throw()には引数は必要ありませんが、オプションで2つのタイプの引数を指定できます。引数を指定した場合、Throwが実行されると、exception_msgという名前のグローバル変数にその文字列が格納されます。これについては、次の最初の例で示します。

Try()Throw()を使って、JMPそのものが出す例外を受け取ってスクリプトを停止させることができます。

Try( Throw( "Hello." ), Show( exception_msg ) );

exception_msg = "Hello.";

次の例では、Try()式を実行できないときにメッセージをログに出力します。

Try(
	dt = Open( "Mydata.jmp" ); // 開くことができないファイル
	Summarize( a = by( 年齢 ), c = count, meanHt = Mean( :Name("身長(インチ)") ) );
	Show( a, c, meanHt );
,
	Print( "このスクリプトは、データセットがないと動作しません。" );
	Throw();
);

Throw()文字列が「!」で始まり、Try()式の中にある場合、Throwは例外が見つかった場所に関するエラーメッセージを作成します。

Try(
	Throw( "!メッセージに感嘆符を含めます" );
,
	Write( "\!Nexception_msg:", exception_msg );
	Print( "例外をキャッチしたブロックのメッセージ(感嘆符含む)" );
);
Print( "このメッセージはTryの後にあるためエラーがあると出力されません" );

また、Try()Throw()を使うと、Forループの入れ子の中から抜け出ることができます。

a = [1 2 3, 4 5 ., 7 8 9];
b = a;
nr = N Row( a );
nc = N Col( a );

// a[2, 3 ] = 2; // "Missing b"という結果を表示させる場合は、この行のコメントを外す

 
Try(
	sum = 0;
	For( i = 1, i <= nr, i++,
		For( j = 1, j <= nc, j++,
			za = a[i, j];
			If( Is Missing( za ),
				Throw( "Missing a" )
			);
			zb = b[j, i];
			If( Is Missing( zb ),
				Throw( "Missing b" )
			);
			sum += za * zb;
		)
	);
,
	Show( i, j, exception_msg );
	Throw();
);

i = 2;

j = 3;

exception_msg = "Missing a";

Throw()を使うために、必ずしもTry()を使う必要はありません。次の例では、Try()によってThrow()を受け取るのではなく、自らスクリプトを停止させます。

dt = New Table(); // 空のデータテーブルを作成
If( N Row( dt ) == 0,
	Throw( "!空のデータテーブル" )
);
より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).