消息

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

基本思想是每条消息有一个确定的名称,形式为 . 可以用这些名称指代消息(对象 的头部为 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 的变量数目不正确时,Wolfram 语言将显示警告消息诸如, F::argx. 如果 Wolfram 语言找不到命名为 F::argx 的消息时,它就用一般消息 General::argx 代替. 可以用 Off[F::argx] 关闭对函数 F 的变量计数的消息,也可以用 Off[General::argx] 关闭所有使用一般消息文本的消息.

当对内部函数给出的变量个数有误时,Wolfram 语言就显示一个消息.
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]=

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

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

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

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

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

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

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 符号相关的比较合适的消息名. 再找不到时 ,Wolfram 语言就将你所定义的任意函数作全局变量 $NewMessage 的值,且将该函数作用到你所要求消息的符号和标记上.

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