3

我在后台运行耗时的代码,而且由于 do-file 开头的小语法错误,有时甚至 10% 的代码都没有执行。

我更希望执行文件的其余部分,因为有时一开始的错误对最后的计算没有影响。

4

2 回答 2

6

(第 2 版)

希望 Stata 忽略错误本身就是错误的。

  1. 如果在 do-file 的早期出现错误,它通常会对后面的内容产生影响。

  2. 假设您让 Stata 按您的意愿工作。你怎么知道 Stata 忽略了重要的事情还是微不足道的事情?如果它忽略了一些琐碎的事情,那应该很容易解决。如果它忽略了一些重要的事情,那就是错误的决定。

现在让我们更具建设性。的帮助do告诉你有一个nostop选项。您需要非常小心如何使用它,但它在这里可以提供帮助。

的上下文do, nostop正是 OP 的上下文。人们有 do-files,由于大数据集或大量繁重的计算,通常预计会花费很长时间,然后将它们设置为“一夜之间”或“在你去吃午饭时”。然后他们会因为发现 do-file 很快就因第一个错误而终止而感到恼火,尤其是如果错误是微不足道的,他们会特别恼火。所以,这个想法do, nostopdo尽可能多的,但作为调试的帮助。例如,假设你在不同的地方弄错了一个变量名;你generate Yy后来参考,它不存在。您可能希望找到分散在文件中的相应错误消息,您可以修复这些错误消息。错误消息是这里的关键。

关于 do 文件的要点是,一旦它们是正确的,您可以为自己节省大量时间,但没有人承诺从一开始就将 do-file 正确放置总是很容易的。

我坚定的建议是:修复错误;不要试图忽略它们。

PScapture在另一个答案中提到。capture可能在精神上看起来相似,但以相似的风格使用它可能是一个坏主意。

capture吃错误消息,所以用户看不到它们。对于调试,这与所需要的相反。

capture确实是程序员的命令,它的用途是程序员代表用户聪明并保持沉默。

例如,假设提供的变量可以是数字或字符串。如果是数字,我们需要做A;如果它是字符串,我们需要做 B。(A 或 B 可能是“无”。)可能会有这样的分支。

  capture confirm str variable myvar 
  if _rc { /// it's numeric 
       <do A> 
  } 
  else { 
       <do B> 
  } 

否则,capture用于处理出现的可预测问题。它不是为了忽略错误。

于 2013-09-05T00:31:01.077 回答
1

如果只有几个命令挂起并且对您以后的计算无关紧要,您始终可以使用capture(作为内联前缀或作为块命令,参见help capture使用)强制程序运行停止的命令该程序。

但是——与 Nick 对这种编写和执行 do-files 方式的一般评论相呼应——在应用的地方同样要小心capture:通常,你应该只将它应用于你确信不会影响以后的代码或计算的命令。或者,更好的是,只需从程序中删除那些出现问题的行,而您显然不需要。

于 2013-09-05T03:30:17.740 回答