Wolfram ResearchPRODUCTSPURCHASEFOR USERSCOMPANYOUR SITES
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.

Documentation / Mathematica / Mathematicaブック / Mathematicaの仕組み / 式のテキスト形入出力  /

2.9.21 メッセージ

計算時に発生するメッセージはすべて一般規定に基づいて処理される.組込み関数の多くがこの一般規定を使いエラーや警告用メッセージを生成している.ユーザ定義の関数についてもこの規定に基づいてメッセージを構築できるようになっている.

メッセージ構築の基本は, symbol::tagの形式でメッセージに固有の名前を与えることである.メッセージの参照はすべてこの名前を使う.( symbol::tagはオブジェクトであり,その頭部は MessageNameになる.)

メッセージの表示制御

1.3.11で説明したように, On Off関数によりメッセージ表示のオンとオフの制御ができる.組込み関数に関するメッセージの多くはデフォルトでオンの状態にある.特定のメッセージが見たくない場合は Off関数を使い表示禁止にしておけばよい.

式を入力すると,警告メッセージが表示される.

In[1]:= Log[a, b, c]

Out[1]=

メッセージを表示禁止にするには Off関数を使いこのように命令しておく.

In[2]:= Off[Log::argt]

今度はメッセージは出ない.

In[3]:= Log[a, b, c]

Out[3]=

組込み関数に関するメッセージの多くはデフォルトでオンの状態にあるが,メッセージによってはデフォルトでオフのものもある.それらはオンにしなければ表示されない.例として General::newsymのメッセージがある(詳細は 2.7.13を参照のこと).このメッセージは新規にメッセージが定義されると表示されるものである.

メッセージの基本操作

表示されるメッセージ文は頭部 sに関連したメッセージ名 s::tagの「値」として保管される.メッセージ文を見るには s::tagと入力する.また,新たに s::tagに割り付けることで別のメッセージ内容を表示させることも可能である.

特異行列に LinearSolve関数を作用させる.すると警告メッセージが表示される.

In[4]:= LinearSolve[{{1, 1}, {2, 2}}, {3, 5}]

Out[4]=

このメッセージを参照してみる.

In[5]:= LinearSolve::nosol

Out[5]=

ユーザ定義のメッセージ文を割り付けてみる.

In[6]:= LinearSolve::nosol ="非可逆の行列が見付かりました."

Out[6]=

警告が出た式をまた入力する.今度は,ユーザ定義のメッセージが表示される.

In[7]:= LinearSolve[{{1, 1}, {2, 2}}, {3, 5}]

Out[7]=

メッセージ文は StringFormに対応した書式付きの文字列として記述される.あるイベントについて メッセージが出力されるとき,イベントを引き起した式が書式指定に従いメッセージ文に代入される.式自体は HoldFormがかけられ評価保留になる.また, StringFormで式が代入処理される前に,メッセージ表示の前処理関数指定の大域変数 $MessagePrePrintに割り付けられている関数があれば式に適用される.デフォルトの前処理関数は Shortが使われる.

メッセージのほとんどはそれを使う関数に密着した内容になっている.これに対して,特定の関数には直接関連付けされない「一般的な」メッセージもある.

関数 Fに必要な数の引数を与えなかったら, F::argxに登録されている警告メッセージが表示される.もし F::argxに何も登録されていなければ,引数不正に関する「一般的な」メッセージ, General::argxが表示されることになっている.また, Off[F::argx]と入力しておけば, Fに関する引数警告メッセージだけを表示禁止にできる.さらに, Off[General::argx]と入力しておくと,引数警告用の一般メッ セージを表示禁止にする.

多すぎる引数を入力する.引数の数が不正という警告文が表示される.

In[8]:= Sqrt[a, b]

Out[8]=

引数の数が不正というメッセージは一般的なもので,実際,多くの関数で使われる.

In[9]:= General::argx

Out[9]=

計算処理がうまくいかないと,よく警告メッセージが何回も表示される.同じことを繰り返して表示してもあまり意味がないし,かえって,混乱させてしまうだろう.そこで,計算中に発生したメッセージはすべて Mathematica内部に一時貯めこまれ,同じメッセージが3回連続して発生した場合,次からの表示が禁止になる.この事態が起ると,一般形メッセージ General::stopが表示されるようになっている.すべてのメッセージを見たい場合は General::stopをオフにしておく.

計算セッションで発生したメッセージの再確認

Mathematicaの内部には $MessageListの名前でリストスペースが確保され,計算が行われるたびに処理中に発生するメッセージがすべて記録される.標準設定の計算セッションでは,このリストは新たな出力行が生成された時点でクリアされてしまう.それでも,計算中にこのリストを参照することができる.また,n番目の出力行が生成されるときには,最終メッセージリスト $MessageListの内容がコピーされ MessageList[n]として別に保管される.

最終メッセージリスト ($MessageList)の全内容を参照できるようにしておく.

In[10]:= Sqrt[a, b, c]; Exp[a, b]; $MessageList

Out[10]=

メッセージの名前には HoldFormがかけられているので,評価の対象にはならない.

In[11]:= InputForm[%]

Out[11]//InputForm= {HoldForm[Sqrt::argx], HoldForm[Exp::argx]}

計算プログラムを作っているときには,どんなメッセージであってもそれが生成されたかどうかを自動検出できることが重要になる.例えば,計算の結果,数値が確定不能になると,あるメッセージが発生する.その場合の計算結果はたぶん無意味なものだろう.

警告メッセージの検出

1^0の計算では何もメッセージが発生しない.計算値がそのまま返ってくる.

In[12]:= Check[1^0, err]

Out[12]=

0^0を計算させると,今度は,メッセージが表示され,Checkの第2引数が返される.

In[13]:= Check[0^0, err]

Out[13]=

Check[expr, failexpr]の機能を使いメッセージ出力があったかどうか検出できる.ただし, Offで表示禁止になっているメッセージについては検出機能は働かない.

特定のメッセージに関してだけ自動検出した方が効果的になることがある.例えば,数値演算におけるオーバーフローのメッセージだけを検出したい場合がある.限定するには Checkの引数に検出したい メッセージの名前を指定しておく.

Sin[1, 2]の計算で発生するメッセージは Checkでは無視される.指定したメッセージではないからである.

In[14]:= Check[Sin[1, 2], err, General::ind]

Out[14]=

メッセージの表示

メッセージ関数 Messageを使い組込み関数の行うメッセージ出力の詳細を再現することができる.例えば, On Off関数を使い関数sのメッセージ表示をオン・オフし,もし,あるとき,メッセージ s::tagが表示禁止になっていたら, Messageが自動的に一般メッセージ General::tagを返してくれる.

fがオーバーフローを起したときに表示するメッセージの内容を定義しておく.

In[15]:= f::overflow = "因数の引数`1`は大きすぎます."

Out[15]=

関数 fを定義する.

In[16]:= f[x_] :=
If[x > 10,
(Message[f::overflow, x]; Infinity), x!]

fの引数が10より大きいのでオーバーフロー状態になり,メッセージが表示さ れる.

In[17]:= f[20]

Out[17]=

メッセージ表示を禁止にしておく.

In[18]:= Off[f::overflow]

今度は,メッセージは現れない.

In[19]:= f[20]

Out[19]=

Messageの動作ステップとして,まず,指定した名前(頭部とタグ)のメッセージが検索される.見付からないときは,指定タグに関連した一般メッセージが検索される.それもない場合は, $NewMessageの大域変数に割り付けられている関数を参照し,指定頭部とタグを引数として同関数を適用する.

$NewMessageを適当に設定しておくことで,例えば,特定のメッセージについて,それがはじめて必要になったときにはファイルからメッセージ文を読み込むようにすることも可能である.



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information


 © 2008 Wolfram Research, Inc.  Terms of Use  Privacy Policy |
Sign up for our newsletter: