信息

Mathematica 有处理计算中所产生信息的机制. 许多 Mathematica 内部函数用这种机制产生错误和警告信息. 这种机制可以用于自定义函数的信息.

基本思想是每条信息有一个确定的名称,形式为 . 可以用这些名称指代信息(对象 的头部为 MessageName.)

Quiet[expr]计算 expr 不显示任何信息
Quiet[expr,{s1::tag,s2::tag,...}]计算 expr 不显示指定的信息
Off[s::tag]关闭信息使其不显示
On[s::tag]打开信息

控制信息的显示.

如 "提示和信息"所示,可以用 Quiet 控制显示特别的信息. 默认情况下,大部分内部函数的有关信息是打开的. 可以使用 Off 永久关闭信息.

这里显示一个警告信息,前端用红色显示额外的参数.
In[1]:=
Click for copyable input
Out[1]=
关闭警告信息.
In[2]:=
Click for copyable input
Out[2]=
该消息在下次计算时再次出现.
In[3]:=
Click for copyable input
Out[3]=

可以使用 OnOff 全局改变特殊信息的显示. 可以用 Off 关闭不想看的信息.

可以用这种方式关闭信息.
In[4]:=
Click for copyable input
现在就不产生警告信息了.
In[5]:=
Click for copyable input
Out[5]=

尽管大部分与内部函数有关的信息默认是打开的,但也有些是关闭的,要明确打开才能显示. 一个例子是信息 General::newsym,详见 "拦截新符号的产生", 任何新符号产生时它会显示一个信息.

s::tag给出信息内容
s::tag=string设置信息内容
Messages[s]显示与 s 相关的信息

信息的操作.

名为 的信息内容作为 的值存放,与符号 s 相联系. 可以简单地用 查看该信息. 也可以通过对 赋值设置信息.

当给 LinearSolve 输入一个奇异矩阵时,它就显示一个警告信息.
In[6]:=
Click for copyable input
Out[6]=
这是信息的内容.
In[7]:=
Click for copyable input
Out[7]=
这里重新定义信息.
In[8]:=
Click for copyable input
Out[8]=
这里将用新形式.
In[9]:=
Click for copyable input
Out[9]=

信息总是以适用于 StringForm 的字符串存放. 当需要显示时,一些相应的表达式就拼接成该信息. 这些表达式用HoldForm 封装,以防止它被计算. 此外,任何被指定为全局变量 $MessagePrePrint 的函数在它们被交给 StringForm 之前作用于这些表达式. $MessagePrePrint 默认使用 Short 作为文本格式,并且组合 ShortShallow 来排版.

大部分信息与产生它们的函数有关. 但也有一些"一般"信息,各种函数都产生这种信息.

当给函数 F 的变量数目不正确时,Mathematica 将显示警告信息诸如, F::argx. 如果 Mathematica 找不到命名为 F::argx 的信息时,它就用"一般"信息 General::argx 代替. 可以用 Off[F::argx] 关闭对函数 F 的变量计数的信息,也可以用 Off[General::argx] 关闭所有使用一般信息文本的信息.

当对内部函数给出的变量个数有误时,Mathematica 就显示一个信息.
In[10]:=
Click for copyable input
Out[10]=
这个自变量计数信息是一个一般信息,许多函数都使用它.
In[11]:=
Click for copyable input
Out[11]=

屏蔽 Sqrt::argx 仅压缩由 Sqrt 函数产生的信息,不是由其它函数产生的.

显示 Sin::argx 信息,不是 Sqrt::argx.
In[12]:=
Click for copyable input
Out[12]=

屏蔽 General::argx 压缩所有使用 General::argx 的信息.

这里,没有显示 信息.
In[13]:=
Click for copyable input
Out[13]=

如果 信息没有使用 General::tag,压缩 General::tag 不会压缩 . 比如,关掉 General::targ 信息不会关掉 Entropy::targ 信息,因为两个信息是不一样的.

Entropy::targGeneral::targ 不一样.
In[14]:=
Click for copyable input
Out[14]=
IdentityMatrix::targGeneral::targ 是一样的.
In[15]:=
Click for copyable input
Out[15]=
Quiet 中仍然显示 Entropy::targ 信息.
In[16]:=
Click for copyable input
Out[16]=

当计算中出现严重错误时,就会发现同样的警告信息反复产生. 这会导致混乱. 于是 Mathematica 就跟踪一个计算过程中的所有信息, 当一条信息重复出现多于3次时就不再显示它. 当这一情况发生时,Mathematica 就显示信息 General::stop 去提醒用户. 如果需要查看所有 Mathematica 显示的信息,就要关闭 General::stop.

$MessageList在一个计算过程中产生的信息列表
MessageList[n]在一个 Mathematica 进程中处理第 n 个输入行时产生的信息列表

找出计算过程中所产生的信息.

在每一个计算中, Mathematica 将所产生的全部信息放在列表 $MessageList 中. 在标准的 Mathematica 进程中,每一行的输出产生后就清除这个信息列表,但在计算过程中可以访问这个列表. 另外,在一个进程中第 n 行的输出产生时,$MessageList 的值就赋给 MessageList[n].

这里返回 $MessageList,它给出了所产生信息的列表.
In[17]:=
Click for copyable input
Out[17]=
信息名由 HoldForm 封装,以阻止它们不被计算.
In[18]:=
Click for copyable input
Out[18]//InputForm=

在编辑时需要自动知道一个计算过程中是否产生了信息. 如果产生的信息告知生成了一些不确定的数值结果,那么计算的结果可能就失去了意义.

Check[expr,failexpr]当计算 expr 时没有产生信息,则返回值 expr; 否则返回 failexpr
Check[expr,failexpr,s1::t1,s2::t2,...]仅检查信息

检查警告信息.

计算 时不产生信息,返回值就是计算结果.
In[19]:=
Click for copyable input
Out[19]=
计算 时产生信息,所以返回值是 Check 的第 2 个变量.
In[20]:=
Click for copyable input
Out[20]=

Check[expr, failexpr] 测试实际显示的所有信息. 并不测试用 Off 关闭的信息.

有时仅需要测试某一些特定信息,如与数值溢出有关的信息,这就需要告诉 Check 所需要测试的信息名.

Sin[1, 2] 产生的信息被 Check忽略,因为它不是所指定的信息.
In[21]:=
Click for copyable input
Out[21]=
Message[s::tag]显示信息
Message[s::tag,expr1,...]显示信息,把 联接成字符串形式

产生信息.

Message 函数可以模仿内部函数产生信息的各种方式. 用 OnOff 打开或关闭信息, Message 找不到指定信息 时就自动寻找 General::tag.

这里定义了与 有关的信息内容.
In[22]:=
Click for copyable input
Out[22]=
这里给出函数 .
In[23]:=
Click for copyable input
的变量大于10时就产生信息.
In[24]:=
Click for copyable input
Out[24]=
这里关闭信息.
In[25]:=
Click for copyable input
现在就不再显示所产生的信息.
In[26]:=
Click for copyable input
Out[26]=

调用 Message 时,它先找指定名称的信息,找不到时它找一个与 General 符号相关的比较合适的信息名. 再找不到时 ,Mathematica 就将你所定义的任意函数作全局变量 $NewMessage 的值,且将该函数作用到你所要求信息的符号和标记上.

通过对 $NewMessage 的适当设置,当第一次需要一个信息时,就可以让 Mathematica 从一个文件读入信息内容.

New to Mathematica? Find your learning path »
Have a question? Ask support »