对我来说最难调试的事情之一就是Mathematica说它检测到了问题,但是当它没有向控制台打印消息时。
像这个图
我调试的方式是打印消息。我有不同级别的调试消息,可以在有问题帮助我找到位置时打开和关闭它们。我的所有调试消息都会转到控制台。
由于Mathematica不会向控制台打印这些警告/错误,因此无法找到此消息的来源。如果确实如此,那么我会知道,因为我可以在它之前看到我自己的消息,并知道这个错误发生的地点和时间。
单击小'+'查看错误是在事实之后,并且它不会告诉消息的位置。
我进入了编辑/偏好设置,并打开所有内容打印到我可以看到的控制台:
不过,这个特殊的'错误'是(当我点击'+'时)
InterpolatingFunction::dmval: Input value {0} lies outside the range
of data in the interpolating function. Extrapolation will be used. >>
只有当我手动点击“+”时才打印到控制台。我想要在发生这种情况时自动完成。
所以,我的问题是,如何让Mathematica将上述消息打印到控制台,当它发生时?
PS。我不知道如何使用WB来调试操作代码。
感谢,
编辑1
我发现错误,这是变量名称中的拼写错误。如果有人想看到它,我把笔记本本身,然后错误重新输入。我很抱歉,我不会尝试在小程序中复制它,但这个笔记本将说明问题in this folder有笔记本(.nb),如果有人想看到它。
错误是我在笔记本中间一半名为“solve[]
”的模块中写的,在我为此函数设置局部变量的行中,以下
Module[{numericalSolution, ic, t, ndsolveOptions, x1, x2, x3, x1de,
上面的最后一个变量应该是'x1der'而不是'x1de',如:
Module[{numericalSolution, ic, t, ndsolveOptions, x1, x2, x3, x1der,
解决这个问题,导致错误消失。
只需运行笔记本,当它出现时,您将在UI单元格支架上看到错误,但控制台上没有错误。 (程序不完整,但工作完成后,将在我的网站Mathematica演示页面上,它是三重摆的模拟)。
再次提问,如何让Mathematica在检测到错误时将此错误打印到控制台。
感谢。
答案 0 :(得分:2)
从屏幕截图中看起来您正在使用Manipulate。使用红色括号来隐藏警告和错误的Manipulate(和其他动态构造)的原因是这些消息在交互时可能会发生很多次,使前端无响应。
要回答有关调试的问题,这是一种可行的方法。考虑这个简单的Manipulate,当你将滑块移动到x = 0时会发出警告:
Manipulate[1/x, {{x, 1}, -3, 3, 1}]
要理解该消息,您可以单击右上角带圆圈的加号并选择“粘贴快照”。这将使用这些参数设置粘贴一段与Manipulate中的代码等效的代码片段。在这种情况下,我得到:
DynamicModule[{x = 0}, 1/x]
我可以对此进行评估并观察笔记本中的Power :: infy消息。在这个特定的例子中,现在是 清楚问题是什么。在更复杂的示例中,您可以使用快照作为图的起点 问题可能是什么。