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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

每当我创建一个大型Mathematica项目时,都会遇到以下问题:用Mathematica防止运行时错误的雪崩,即Mathematica的错误消息是不透明的、过时的和军团的。在每个函数和模块中禁用Mathematica自己的所有错误消息,并实现您自己的类型检查和错误消息。

但是,我还没有找到一种简单有效的方法来完成这个任务,例如,一些函数生成一个错误20函数调用深度,然后得到一系列的错误消息,然后一直返回到主例程。

提问于
用户回答回答于

在每个函数和模块中禁用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={}然后在每一个FunctionModule一开始AppendTo[theStack,"thisFuncName"]并以theStack=Most@theStack。假设函数调用的深度适中(大约几十个),这不应增加任何重大开销。

Print@theStack;Abort[];关于错误。

这一方法的改进可包括:

  1. 找到一种动态获取“this FuncionName”的方法,以便AppendTo[]可以对所有用户进行相同的函数调用。FunctionsModule
  2. 使用Message[]而不是Print[]
  3. 将其他重要变量/状态信息推送到theStack

扫码关注云+社区