我刚发现MathLink
和LinkWrite
这样的LinkRead
函数有类似于它自己的内部CheckAbort
,可以吸收任何中止,并且不会进一步传播它们。 / p>
可以使用LinkRead
:
link = LinkLaunch[First[$CommandLine] <> " -mathlink"];
LinkRead[link];
LinkWrite[link, Unevaluated[Pause[10]]];
{LinkRead[link], Print["!!"]}
在评估上述代码后,按 Alt + 。 ,您将获得以下输出:
During evaluation of In[6]:= !!
Out[9]= {ReturnPacket[$Aborted], Null}
如您所见,中止被LinkRead
吸收。
我的问题是它违反了我自己的评估流程控制,基于CheckAbort
。
有没有办法拦截LinkRead
和LinkWrite
等功能所吸收的中止?
答案 0 :(得分:1)
MathLink的工作方式,LinkRead
阻止链接上没有任何内容可读。如果此时尝试中止,则会通过MathLink消息通道将中止消息传递到链接的另一端。如果另一端的程序运行良好,它将丢弃它正在做的任何事情并发送一个返回值(在许多情况下$Aborted
)。如果要将中止传播到链接的末尾,以便可以使用CheckAbort
捕获它,则需要检查返回值并生成另一个中止,例如:
If[LinkRead[link] == $Aborted, Abort[]]
如果您知道链接的另一端在中止的情况下返回$Aborted
,则此方法有效。