有没有办法告诉 Stata 执行整个 do-file 忽略产生异常(甚至语法错误)的行?
Posted
技术标签:
【中文标题】有没有办法告诉 Stata 执行整个 do-file 忽略产生异常(甚至语法错误)的行?【英文标题】:Is there a way to tell Stata to execute the whole do-file ignoring the lines producing exceptions (or even syntax errors)? 【发布时间】:2013-09-05 00:19:39 【问题描述】:我在后台运行耗时的代码,由于do-file开头的小语法错误,有时甚至10%的代码都没有执行。
我更希望执行文件的其余部分,因为有时开头的错误对结尾的计算没有影响。
【问题讨论】:
【参考方案1】:(第 2 版)
希望 Stata 忽略错误本身可能是错误的。
如果在执行文件的早期出现错误,它通常会影响后面的内容。
假设您让 Stata 按您的意愿工作。你怎么知道 Stata 忽略了重要的事情还是微不足道的事情?如果它忽略了一些琐碎的事情,那应该很容易解决。如果它忽略了一些重要的事情,那就是错误的决定。
现在让我们更具建设性。 do
的帮助告诉您有一个 nostop
选项。
您需要非常小心如何使用它,但它在这里可以提供帮助。
do, nostop
的上下文正是 OP 的上下文。人们有 do-files,由于大数据集或大量繁重的计算,通常预计会花费很长时间,然后将它们设置为“一夜之间”或“在你去吃午饭时”。然后他们会因为发现 do-file 很快就因第一个错误而终止而感到恼火,尤其是如果错误是微不足道的,他们会特别恼火。所以,do, nostop
的想法是尽可能多地使用do
,但作为调试的帮助。例如,假设你在不同的地方弄错了一个变量名;你generate Y
但稍后参考y
,它不存在。您可能希望找到分散在文件中的相应错误消息,您可以修复这些错误消息。错误消息是这里的关键。
关于 do 文件的要点是,一旦它们正确,您可以为自己节省大量时间,但没有人承诺从一开始就将 do 文件正确化总是很容易的。
我坚定的建议是:修复错误;不要试图忽略它们。
附: capture
在另一个答案中被提及。 capture
可能在精神上看起来相似,但以相似的风格使用它可能是一个坏主意。
capture
吃掉错误消息,所以用户看不到它们。对于调试,这与所需要的相反。
capture
确实是程序员的命令,它的用途是程序员代表用户聪明并保持沉默。
例如,假设提供的变量可以是数字或字符串。如果是数字,我们需要做A;如果它是字符串,我们需要做 B。(A 或 B 可能是“无”。)可能会有这样的分支。
capture confirm str variable myvar
if _rc /// it's numeric
<do A>
else
<do B>
否则,capture
用于处理可预测的问题(如果出现)。它不是为了忽略错误。
【讨论】:
+1 秒 @Nick。 do 文件应该在没有 Stata 抱怨的情况下自行运行,即使修复小错误也确实值得。既可以让您确保自己在做正确的事情,也可以让其他人有一天会尝试重用您的代码!这实际上是我更喜欢的 Stata 的特性,例如 R - 作为一个菜鸟,我经常发现自己犯的错误没有给出或错误的结果.. R 将继续执行脚本。【参考方案2】:如果只有几个命令挂起并且对您以后的计算无关紧要,您始终可以使用capture
(作为内联前缀或作为块命令,请参阅help capture
on use)来强制程序运行停止程序的命令。
但是——与尼克关于这种编写和执行 do-files 方式的一般 cmets 相呼应——在应用 capture
时同样要小心:通常,你应该只将它应用到你确定不会影响以后的代码或计算。或者,更好的是,只需从程序中删除那些出现问题的行,而您显然不需要。
【讨论】:
好建议。我在自己的回答中加强了建议。 (我所说的不适合发表评论。) 是的。 @NickCox 强调了,nostop
选项和 capture
命令之间的重要区别,我没有。如果需要调试,则永远不要使用capture
(在这种情况下它是无用的)。以上是关于有没有办法告诉 Stata 执行整个 do-file 忽略产生异常(甚至语法错误)的行?的主要内容,如果未能解决你的问题,请参考以下文章
在Stata中,foreach x的R等价函数是什么?[关闭]