【问题标题】:Is there a way to tell Stata to execute the whole do-file ignoring the lines producing exceptions (or even syntax errors)?有没有办法告诉 Stata 执行整个 do-file 忽略产生异常(甚至语法错误)的行?
【发布时间】:2013-09-05 00:19:39
【问题描述】:

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

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

【问题讨论】:

    标签: execution stata


    【解决方案1】:

    (第 2 版)

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

    1. 如果在执行文件的早期出现错误,它通常会影响后面的内容。

    2. 假设您让 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(在这种情况下它是无用的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多