在大型Mathematica项目中设置诊断错误消息

每当我创建一个大型的Mathematica项目时,我都会遇到这个问题:防止Mathematica发生运行时错误,即Mathematica的错误消息是不透明的,古老的和军团。

然后,这个想法是禁用所有Mathematica自己的错误消息,并在每个函数和模块中实现自己的类型检查和错误消息。 然而,我还没有找到一个简单而有效的方法来完成这个任务,并且最终会产生一些函数,例如深度函数调用产生一个错误,然后将所有错误消息一起返回到主例程。

你将如何为此设置一个简单的机制,仅在遇到错误的函数和函数调用链的简单列表中生成一条错误消息?

编辑:由于它已经出现在几个答案; 我专门寻找轻量级的产品(否则我可以坚持使用Mathematica的错误消息),而且在计算开销方面显然也是轻量级的。 因此,虽然StackTrace在开销方面确实很轻,但是它们在复杂项目中的输出不会很快解析,需要完成一些工作才能简化它。


YAsI - 又一个(愚蠢的)想法...

重新阅读你的问题...

然后,这个想法是禁用所有Mathematica自己的错误消息,并在每个函数和模块中实现自己的类型检查和错误消息。

找到这个:

$MessagePrePrint = ( #; Print[Stack[_][[;; -5]]]; Abort[]) &  

v[x_, y_] := w[x, y];
w[x_, y_] := x/y;

StackComplete@v[1, 0];

During evaluation of In[267]:= {StackComplete[v[1,0]];,
          StackComplete[v[1,0]], v[1,0], w[1,0], 1/0, 1/0, Message[Power::infy,1/0]}

Out[267]= $Aborted

结论...在第一条消息中放弃并留下“合理的”堆栈跟踪。 “合理”是指“应该改进”。

但它是完全非侵入性的!


为了让球在这里滚动是我一直在玩的一个想法; 创建一个伪堆栈。

首先创建一个全局变量theStack={} ,然后在每个FunctionModuleAppendTo[theStack,"thisFuncName"]并以theStack=Most@theStack 。 假设适度(〜几十)的函数调用深度,这应该不会增加任何显着的开销。

然后执行你自己的打字/错误检查并使用Print@theStack;Abort[]; 对错误。

这种方法的改进可以包括:

  • 找出一种动态获取“thisFuncionName”的方法,以便AppendTo[]可以作为所有FunctionsModule的相同函数调用。
  • 使用Message[]而不是Print[]
  • theStack上推送其他重要变量/有状态信息。

  • 一个尝试实现@蒂莫的想法(theStack)

    不完整,也许有缺陷,但只是继续思考:

    Clear["Global`*"];
    funcDef = t_[args___]  [CircleMinus] a_ :>
       {t["nude", args] := a,
        ReleaseHold[Hold[t[args] :=
           (If[! ValueQ[theStack], theStack = {}];
            AppendTo[theStack, ToString[t]];
            Check[ss = a, Print[{"-TheStack->", Evaluate@theStack}]; 
             Print@Hold[a]; Abort[]];
            theStack = Most@theStack;
            Return[ss])
          ]]};
    v[x_, y_][CircleMinus]  (Sin@ g[x, y]) /. funcDef;
    g[x_, y_][CircleMinus]  x/y /. funcDef;
    v[2, 3]
    v[2, 0]
    

    输出:

    Out[299]= Sin[2/3]
    
    During evaluation of In[295]:= Power::infy: Infinite expression 1/0 encountered. >>
    
    During evaluation of In[295]:= {-TheStack->,{v,g}}
    
    During evaluation of In[295]:= Hold[2/0]
    
    Out[300]= $Aborted
    
    链接地址: http://www.djcxy.com/p/35507.html

    上一篇: Setting up diagnostic error messages in large Mathematica projects

    下一篇: Preventing avalanche of runtime errors in Mathematica