防止 Mathematica 中出现雪崩的运行时错误

2024-01-05

当笔记本超出几个功能时我遇到的典型情况 - 我评估一个表达式,但得到的不是正确答案Beep接下来是数十个无用的警告,然后是“……的进一步输出将被抑制”

我发现一件事很有用——在函数内部使用类似 Python 的“assert”来强制内部一致性。还有其他提示吗?

Assert[expr_, msg_] := If[Not[expr], Print[msg]; Abort[], None]

编辑 11/14警告雪崩的一般原因是子表达式的计算结果为“坏”值。这会导致父表达式计算为“坏”值,并且这种“坏”会一直传播到根。一路评估的内置函数会注意到不良情况并产生警告。 “坏”可能意味着一个具有错误 Head 的表达式、具有错误数量元素的列表、负定矩阵而不是正定矩阵等。通常,它不符合父表达式的语义。

处理这个问题的一种方法是重新定义所有函数,以在“错误输入”时返回未计算的值。这将处理内置函数生成的大多数消息。执行“Part”等结构操作的内置函数仍会尝试评估您的值并可能会产生警告。

将调试器设置为“消息中断”可以防止大量错误,尽管始终打开它似乎有些过分


正如其他人指出的那样,可以通过三种方法以一致的方式处理错误:

  1. 正确输入参数并设置函数运行的条件,
  2. 正确且一致地处理所产生的错误,以及
  3. 简化您的方法来应用这些步骤。

As Samsdram https://stackoverflow.com/questions/4174791/preventing-undecipherable-runtime-errors-in-mathematica/4175641#4175641指出,正确键入您的函数将有很大帮助。不要忘记:的形式因为有时以这种形式更容易表达某些模式,例如x:{{_, _} ..}。显然,当这还不够时PatternTests () and Conditions ()是要走的路。 Samdram 很好地涵盖了这一点,但我想补充一点,您可以通过纯函数创建自己的模式测试,例如f[x_?(Head[#]===List&)]相当于f[x_List]。请注意,使用纯函数的&符号形式时,括号是必需的。

处理生成的错误的最简单方法显然是Off,或者更多本地化。在大多数情况下,我们都同意完全关闭我们不想要的消息是一个坏主意,但是Quiet当您知道自己正在做的事情会引起抱怨但在其他方面是正确的时,这会非常有用。

Throw and Catch有它们的位置,但我觉得它们应该只在内部使用,并且您的代码应该通过设施。可以按照与设置使用消息相同的方式创建消息。我相信可以使用以下函数构建连贯错误策略的关键, , .

Example

我的代码的一个例子是OpenAndRead它可以防止中止读取操作时留下打开的流,如下所示:

OpenAndRead[file_String, fcn_]:=
Module[{strm, res},
  strm = OpenRead[file];
  res = CheckAbort[ fcn[strm], $Aborted ];
  Close[strm];
  If[res === $Aborted, Abort[], res] (* Edited to allow Abort to propagate *)
]

直到最近,还有使用

fcn[ file_String, <otherparams> ] := OpenAndRead[file, fcn[#, <otherparams>]&]
fcn[ file_InputStream, <otherparams> ] := <fcn body>

然而,每次这样做都很烦人。

这是哪里贝利撒留 https://stackoverflow.com/questions/4174791/preventing-undecipherable-runtime-errors-in-mathematica/4176010#4176010通过创建一种可以一致使用的方法,解决方案就可以发挥作用。不幸的是,他的解决方案有一个致命的缺陷:你失去了对语法突出显示功能的支持。所以,这是我想出的一个替代方案OpenAndRead从上面

MakeCheckedReader /: 
    SetDelayed[MakeCheckedReader[fcn_Symbol, symbols___], a_] :=
    Quiet[(fcn[file_String, symbols] := OpenAndRead[file, fcn[#, symbols] &];
           fcn[file_Symbol, symbols] := a), {RuleDelayed::"rhs"}]

有使用情况

MakeCheckedReader[ myReader, a_, b_ ] := {file$, a, b} (*as an example*)

现在,检查定义myReader给出了两个定义,就像我们想要的那样。但在函数体中,file必须被称为file$。 (我还没有弄清楚如何按照我的意愿命名文件 var 。)

Edit: MakeCheckedReader其工作原理是其本身不做任何事情。相反,TagSet () 规范告诉 Mathematica 当MakeCheckedReader是在 LHS 上找到的SetDelayed然后将其替换为所需的函数定义。另外,请注意使用Quiet;否则,它会抱怨模式a_ and b_出现在等式的右侧。

Edit 2: Leonid https://stackoverflow.com/users/565518/leonid-shifrin指出如何能够使用file not file$定义检查的读者时。更新后的解决方案如下:

MakeCheckedReader /: 
    SetDelayed[MakeCheckedReader[fcn_Symbol, symbols___], a_] :=
    Quiet[(fcn[file_String, symbols] := OpenAndRead[file, fcn[#, symbols] &];
           SetDelayed @@ Hold[fcn[file_Symbol, symbols], a]), 
           {RuleDelayed::"rhs"}]

更改的原因在此进行了解释answer https://stackoverflow.com/questions/6236458/plot-using-with-versus-plot-using-block-mathematica/6236808#6236808他的。定义myReader,如上所述,并检查其定义,我们得到

myReader[file$_String,a_,b_]:=OpenAndRead[file$,myReader[#1,a_,b_]&]
myReader[file_Symbol,a_,b_]:={file,a,b}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止 Mathematica 中出现雪崩的运行时错误 的相关文章

  • 当 DownValues 已经存在时可以阻止 OwnValues 吗?

    对于已经分配了与名称 a 关联的 DownValues 的情况 是否有一种可接受的方法来阻止将 OwnValues 分配给相同的名称 我最初是在尝试某人实现数据字典时遇到这个问题的 这就是我要避免的 Remove a a 1 somethi
  • 在 Mathematica 中绘制数轴

    我想在 Mathematica 的数轴上绘制一个简单的区间 我该怎么做呢 为了绘制开区间或闭区间 你可以这样做 intPlot ss s e ee Graphics Red Thickness 01 Text Style ss Large
  • 如何使用 Mathematica 查找 Waldo?

    这周末困扰着我 有什么好方法来解决这些问题沃尔多在哪里 https en wikipedia org wiki Where 27s Wally 3F Wally 北美以外 谜题 使用 Mathematica 图像处理和其他功能 这是我到目前
  • 制作自定义输入表和简短输入表

    我经常希望看到数学的图形对象不在FullForm但更具可读性InputForm能够通过双击来选择代码的一部分 并轻松地将此代码复制到新的输入中Cell 但默认的InputForm不允许这样做 因为InputForm默认显示为String 不
  • 如何在mathematica中应用涉及一百个变量的规则

    我有一个涉及 x1 x2 x100 的表达式 我还有一个列表lst有 100 个元素 如何将规则应用于此表达式以实现如下所示的效果 exp x1 gt lst 1 x2 gt lst 2 x100 gt lst 100 Thanks exp
  • 计算与谓词匹配的元素数量的惯用方法是什么?

    除了这个之外 是否有更好的方法来计算谓词函数为 true 的元素数量 PredCount lst pred Length Select lst pred 我问这个问题是因为构建一个子集似乎效率低下lst with Select 并且因为Co
  • 简化 Mathematica 中的正则表达式

    我最近发现克莱尼代数 http en wikipedia org wiki Kleene algebra用于操作和简化正则表达式 我想知道这是否已内置到 Mathematica 等任何计算软件程序中 如果有一个计算工具来进行大型表达式的并集
  • C# 中的复杂计算

    最好的 最有效的 工具是什么 NET C 用于计算 积分 偏导数 其他不平凡的数学 人们能否对 Mathematica 和 Matlab 及其集成发表评论C Math NET http www mathdotnet com是一个用 C 编写
  • Mathematica 中的语法着色

    用户定义的函数符号如f in f x 2 x 或变量符号 例如lotto in lotto Table 2 10 自动着色 在 M8 上的语法着色中 没有为此提供选项 仅限未分配值的局部变量或全局符号 这并不完全是您所要求的 但可能对您有用
  • 了解内核-前端通信——为什么我的前端冻结?

    EDIT 只需确认您是否可以重现此内容就会很有用 只需一台计算机即可尝试此操作 无需远程连接 Update似乎其他人无法在 Mac 或 Win7 上重现此问题 因此它要么是 WinXP 特定的 要么是我的机器特定的 此时我要放弃了 最好有一
  • 在 Mathematica 中使用多个包和引用构建应用程序包

    我正在 Mathematica 中构建一个应用程序包 应用程序包含多个包并引用其他应用程序包 为了设置一切 我使用并遵循了工作台帮助部分的应用程序包说明 该部分也可以在以下位置找到 http reference wolfram com wo
  • 用于出版质量图的 Python Pylab pcolor 选项

    我正在尝试使用 DFT 离散傅立叶变换 图pcolor在Python中 我之前一直使用 Mathematica 8 0 来执行此操作 但我发现 Mathematica 8 0 中的颜色条与我尝试表示的数据具有不良的一对一相关性 例如 这是我
  • 将符号暴露给 $ContextPath

    有多种Internal 有用的上下文函数 例如InheritedBlock https stackoverflow com questions 4198961 what is in your mathematica tool bag 568
  • 在 Mathematica 中创建具有不同颜色边的图形

    我想创建一个图 图论 其中某些边具有与其他边不同的颜色 这将用于突出显示图中从一个顶点到另一个顶点的路径 以下是一些具有不同颜色边缘的示例http demonstrations wolfram com AGraphTheoryInterpr
  • 在 Mathematica 中使用 f@expr 和 expr // f 得到不同的结果

    我正在玩Prefix and Postfix运算符 and 分别 我遇到了以下问题 给定以下代码 它们以完全相同的方式进行评估 Hold MatrixPlot Sort data FullForm Hold MatrixPlot Sort
  • R 中从右到左的运算符结合性可能吗?

    我是 R 新手 我刚刚发现我患有支架恐惧症 https mathematica stackexchange com a 17315 2266 请参阅链接中的评论 我喜欢这种方式magrittr符号 gt 有效 因为它在某些情况下避免了嵌套括
  • 如何默认显示动画控件

    在mathematica中这个简单的控制对象中 如下所示 Control x 0 1 我们必须将鼠标指针移至对象的右上角才能获得名为 显示动画控件 的提示 然后单击它以查看播放 前进等动画控件 有没有办法通过设置一些选项来默认情况下打开所有
  • 自动保存笔记本(或mathematica中的其他类型文件)文件

    我现在有时会遇到这个问题 部分原因是 Microsoft Office 自动保存您正在使用版本和自动恢复处理的文件 很多时候 当我在mathematica中启动一个新笔记本来做一些测试或其他事情时 我经常忘记保存我正在做的事情 时不时地 根
  • 如何在mathematica中进行函数替换

    我有这样的表情D f x y x 我想替换f x y with x y 我尝试了以下方法 D f x y x f x y gt x y and D f x y x f gt x y 但两者都不起作用 将不胜感激您的帮助 谢谢 The Ful
  • ArrayPlot 中的自定义 ColorFunction/ColorData(以及类似函数)

    这与西蒙有关关于更改默认 ColorData 的问题 https mathematica stackexchange com q 4712 121在数学中 虽然解决方案都解决了改变的问题ColorData在线图中 我不太发现讨论对改变Col

随机推荐