每当我创建一个大型 Mathematica 项目时,我都会遇到这个问题:Preventing avalanche of runtime errors in Mathematica ,即 Mathematica 的错误信息是 opaque、archaic 和 legion。
然后的想法是禁用 Mathematica 自己的所有错误消息,并在每个函数和模块中实现您自己的类型检查和错误消息。但是,我还没有找到一种简单而有效的方法来执行此操作,例如,某些函数会产生错误 20 次函数调用深度,然后将整个级联的错误消息一直返回到主程序。
您将如何为此设置一个简单的机制,仅在遇到错误的函数处生成一条错误消息以及函数调用链的简单列表?
编辑:因为它已经出现了几个答案;我特别在寻找关于它产生的输出的轻量级的东西(否则我可以坚持使用 Mathematica 的错误消息)并且显然在计算开销方面也是轻量级的。所以虽然Stack
和 Trace
开销肯定很轻,它们在复杂项目中的输出解析速度不快,需要做一些工作来简化它。
最佳答案
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
结论......在第一条消息中中止并留下“合理的”堆栈跟踪。 “合理”的意思是“应该改进”。
但它是完全非侵入性的!
关于error-handling - 在大型 Mathematica 项目中设置诊断错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4176612/