有没有办法告诉 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软件将dta文件转换为csv

在Stata中,foreach x的R等价函数是什么?[关闭]

有没有办法告诉 crossfilter 将数组元素视为单独的记录,而不是将整个数组视为单个键?

有没有办法告诉gcc忽略“”?

是否有突出显示 Stata 语法的命令行编辑器? [关闭]

如何在编译之前告诉自动生成的 Makefile 执行脚本?