メッセージとエラー処理 †
SAD は関数の実行中にエラーが発生するとそれに対応するメッセージを生成します。そしてその関数の実行は中断され、関数の結果はその関数を呼び出した形そのものになります。その時点でメッセージは端末に出力されますが、関数 Off により出力を抑制することもできます。また、メッセージの重要度に応じて、その後のプログラムの実行は中断または継続されます。また、メッセージの発生は関数 Check により検出することができます。
次の例
Log[1, 2, 3] + Sin[1, 2]
???General::narg: Number of arguments is expected 1 or 2 in Log[1,2,3]
???General::narg: Number of arguments is expected 1 in Sin[1,2]
Out[4]:= (Log[1,2,3]+Sin[1,2])
はこのようなメッセージが発生した例です。ここで General::narg がこのメッセージを識別する式です。この例では まず Log[1, 2, 3] でエラーが発生していますが、そのまま実行が継続され次の Sin[1, 2] を実行し、そこでまた同じメッセージを生成しています。これらは同じメッセージでありながら末尾が異なっています。実はこの General::narg というメッセージは
General::narg
Out[5]:= "Number of arguments is expected `1`"
というもので、この中の `1` には別の文字列が代入されるようになっています。また、行頭の ??? と行末の in ... 以降はシステムが付加するものです。
ユーザーはまた、自分のプログラムのなかで随時メッセージを発行することができます。そのようなメッセージの登録は関数 MessageName(演算子 ::) で行います。
MessageName, :: †
- シンボル1::タグ1 はシンボル1 とタグ1 で識別される、登録されたメッセージを返します。
- シンボル1::タグ1 のメッセージが未登録の場合は General::タグ1 のメッセージが返されます。
- シンボル1::タグ1 = メッセージ1 はシンボル1 とタグ1 で識別されるメッセージ1 を登録します。シンボル1 とタグ1 は任意の式で構いませんが通常はシンボルが用いられます。なお、シンボル1 とタグ1は評価されずそのままの形で用いられます。
- Print[Definition[MessageName]] により登録されているメッセージをすべて端末に表示できます。
Off †
- Off[シンボル1::タグ1] はメッセージ シンボル1::タグ1 の出力を以後停止します。
- Off されたメッセージは Check で検出できません。
On †
- On[シンボル1::タグ1] はメッセージ シンボル1::タグ1 の出力を以後可能にします。
- On[General::newsym] とすると、以後新しい名前のシンボルが生成される度にメッセージ General::newsym が出力されます。これはシンボルの書き誤りなどを検出する場合の助けになります。
$MessageList †
- シンボル $MessageList にはその入力行の実行中にそれまでに発生したメッセージの識別子のリストが割り当てられます。各識別子には Hold が被されています。
MessageList †
- MessageList[n] は出力行n の実行中に発生したメッセージの識別子のリストを返します。各識別子には Hold が被されています。
- 次の出力行の番号はシンボル $Line に割り当てられています。Out 参照。
Check †
- Check[式1, 式2] は 式1 を評価し、その途中でメッセージが発生した場合、式2 を評価してその値を返します。エラーが発生しない場合は式1 を評価した値を返します。
- Check[式1, 式2, シンボル1::タグ1, ...] はシンボル1::タグ1, ... で識別されるメッセージが発生した場合だけ 式2 を評価します。
- Off されたメッセージには Check は反応しません。
Message †
- Message[シンボル1::タグ1] はシンボル1::タグ1 で識別されるメッセージを生成します。
- Message[シンボル1::タグ1, 文字列1, ...] はシンボル1::タグ1 の中の `1`, ... という文字列を文字列1, ...に置き換えたものを表示メッセージとして生成します。