gpt4 book ai didi

wolfram-mathematica - 防止 Mathematica 中的运行时错误雪崩

转载 作者:行者123 更新时间:2023-12-03 23:20:22 28 4
gpt4 key购买 nike

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

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

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

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

解决此问题的一种方法是重新定义所有函数以返回未评估的“错误输入”。这将处理内置程序生成的大多数消息。执行诸如“Part”之类的结构操作的内置函数仍会尝试评估您的值并可能产生警告。

将调试器设置为“中断消息”可以防止大量错误,尽管一直打开它似乎有点过头了

最佳答案

正如其他人所指出的,有三种方法可以以一致的方式处理错误:

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

  • Samsdram指出,正确键入您的函数将有很大帮助。不要忘记 : Pattern 的形式因为有时以这种形式表达一些模式更容易,例如 x:{{_, _} ..} .显然,当这还不够时 PatternTest s ( ? ) 和 Condition s ( /; ) 是要走的路。 Samdram 很好地涵盖了这一点,但我想补充一点,您可以通过纯函数创建自己的模式测试,例如 f[x_?(Head[#]===List&)]相当于 f[x_List] .请注意,在使用纯函数的 & 形式时,括号是必需的。

    处理产生的错误的最简单方法显然是 Off , 或更多本地 Quiet .在大多数情况下,我们都同意完全关闭我们不想要的消息是个坏主意,但是 Quiet当您知道自己正在做的事情会引起投诉但在其他方面是正确的时,它会非常有用。
    ThrowCatch有它们的位置,但我觉得它们应该只在内部使用,你的代码应该通过 Message 传达错误设施。可以以与设置使用消息相同的方式创建消息。我相信可以使用函数 Check 构建连贯错误策略的关键。 , CheckAbort , AbortProtect .

    例子

    我的代码中的一个示例是 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>

    但是,每次都这样做很烦人。

    这是 belisarius通过创建一种可以始终使用的方法,解决方案开始发挥作用。不幸的是,他的解决方案有一个致命的缺陷:你失去了对语法高亮工具的支持。所以,这是我想出的一个替代方案,用于连接 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。)

    编辑 : MakeCheckedReader通过实际上不做任何事情本身来工作。相反, TagSet ( /: ) 规范告诉 Mathematica 当 MakeCheckedReader可在 SetDelayed 的 LHS 上找到然后用所需的函数定义替换它。另外,请注意 Quiet 的使用。 ;否则,它会提示模式 a_b_出现在等式的右边。

    编辑 2 : Leonid指出如何能够使用 file不是 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 中解释了更改的原因。他的。定义 myReader ,如上所述,并检查其定义,我们得到
    myReader[file$_String,a_,b_]:=OpenAndRead[file$,myReader[#1,a_,b_]&]
    myReader[file_Symbol,a_,b_]:={file,a,b}

    关于wolfram-mathematica - 防止 Mathematica 中的运行时错误雪崩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4174791/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com