Wolfram mathematica 由JLink或UseFrontEnd生成的未捕获抛出
此示例例程在内核窗口中生成两条Throw::nocatch警告消息。他们能被处理吗 该示例在C:\Temp中创建的文件“test.m”中包含以下代码:Wolfram mathematica 由JLink或UseFrontEnd生成的未捕获抛出,wolfram-mathematica,mathematica-frontend,Wolfram Mathematica,Mathematica Frontend,此示例例程在内核窗口中生成两条Throw::nocatch警告消息。他们能被处理吗 该示例在C:\Temp中创建的文件“test.m”中包含以下代码: Needs["JLink`"]; $FrontEndLaunchCommand = "Mathematica.exe"; UseFrontEnd[NotebookWrite[CreateDocument[], "Testing"]]; 然后粘贴这些命令并在Windows命令提示符下运行: PATH = C:\Program Files\Wolf
Needs["JLink`"];
$FrontEndLaunchCommand = "Mathematica.exe";
UseFrontEnd[NotebookWrite[CreateDocument[], "Testing"]];
然后粘贴这些命令并在Windows命令提示符下运行:
PATH = C:\Program Files\Wolfram Research\Mathematica\8.0\;%PATH%
start MathKernel -noprompt -initfile "C:\Temp\test.m"
附录
使用UseFrontEnd而不是使用FrontEnd的原因是,可能需要一个交互式前端来保存通常以交互方式运行的笔记本电脑的输出和消息。例如,对C:\Temp\test.m进行如下修改:
Needs["JLink`"];
$FrontEndLaunchCommand="Mathematica.exe";
UseFrontEnd[
nb = NotebookOpen["C:\\Temp\\run.nb"];
SelectionMove[nb, Next, Cell];
SelectionEvaluate[nb];
];
Pause[10];
CloseFrontEnd[];
以及使用单个单元格创建的笔记本C:\Temp\run.nb,其中包含:
x1 = 0; While[x1 < 1000000,
If[Mod[x1, 100000] == 0,
Print["x1=" <> ToString[x1]]]; x1++];
NotebookSave[EvaluationNotebook[]];
NotebookClose[EvaluationNotebook[]];
x1=0;而[x1<1000000,
如果[Mod[x1,100000]==0,
打印[“x1=”ToString[x1]];x1++];
笔记本保存[评估笔记本[];
记事本关闭[EvaluationNotebook[];
此代码从Windows命令提示符启动,将以交互方式运行并保存其输出。使用前端或MathKernel-script“C:\Temp\test.m”无法实现这一点。在初始化过程中,内核代码处于防止中止的模式 Throw/Catch是通过Abort实现的,因此它们在初始化期间不起作用 显示问题的一个简单示例是将其放在test.m文件中:
Catch[Throw[test]];
类似地,时间约束函数、MemoryConstrained函数、Break函数、跟踪族函数、Abort函数以及依赖于这些函数的函数(如某些数据包)在初始化过程中也会遇到类似的问题
<> P>一个可能的解决方案可能是考虑脚本选项:
math.exe -script test.m
另外,请注意,在版本8中有一个名为UsingFrontEnd的文档化函数,它执行UseFrontEnd所做的操作,但是自动配置的,因此:
Needs["JLink`"];
UsingFrontEnd[NotebookWrite[CreateDocument[], "Testing"]];
应该是test.m文件中所需的全部内容
另见:
附录
使用-script和使用前端的一个可能的解决方案是使用“run.m脚本”
包括在下面。这确实需要在内核配置选项中设置“测试”内核(基本上是“本地”内核设置的克隆)
该脚本包括两个实用程序函数,NotebookEvaluatingQ和NotebookPauseForEvaluation,它们帮助脚本在保存之前等待客户端笔记本完成评估。这种方法的优点是,所有评估控制代码都在“run.m”脚本中,因此客户端笔记本不需要在末尾有NotebookSave[EvaluationNotebook[]]语句
NotebookPauseForEvaluation[nb_] := Module[{},While[NotebookEvaluatingQ[nb],Pause[.25]]]
NotebookEvaluatingQ[nb_]:=Module[{},
SelectionMove[nb,All,Notebook];
Or@@Map["Evaluating"/.#&,Developer`CellInformation[nb]]
]
UsingFrontEnd[
nb = NotebookOpen["c:\\users\\arnoudb\\run.nb"];
SetOptions[nb,Evaluator->"Test"];
SelectionMove[nb,All,Notebook];
SelectionEvaluate[nb];
NotebookPauseForEvaluation[nb];
NotebookSave[nb];
]
我希望这对你有所帮助。它还需要一些改进,比如将笔记本的内核重置为原来的内核,并在保存后关闭笔记本,
但是这个代码应该用于这个特殊的目的
另一方面,我尝试了另一种方法,即:
UsingFrontEnd[ NotebookEvaluate[ "c:\\users\\arnoudb\\run.nb", InsertResults->True ] ]
但这将内核终端会话踢入对话模式,这似乎是一个bug
对我来说(如果这是一个有效的问题,我将对此进行检查并报告)。@Leonid,它在这里的内核窗口中也可以正常工作。问题似乎是-initfile方法和JLink之间的一些交互。没有使用-script的消息,但这并不是我想要的。目前在M8.0.1 XP SP3上。明天我将尝试另一台机器。对不起,我不知怎么错过了那些错误。我现在确实复制了它们。不知道为什么以前没有注意到它们。@Arnoud,谢谢你的解释。我正在使用UseFrontEnd启动一个交互式前端来捕获输出,正如我刚才添加的附录所示。使用前端和MathKernel-script都不利于实现这一点,因此我计划继续使用UseFrontEnd,尽管没有任何警告消息。@Arnoud,
NotebookEvaluatingQ
方法很有趣。