【问题标题】:Does Stata have any `try and catch` mechanism similar to Java?Stata 是否有任何类似于 Java 的“try and catch”机制?
【发布时间】:2013-05-28 21:02:35
【问题描述】:

我正在写一个.do 来检查一些.dta 文件中是否存在一些变量,以及检查这些变量的某些值是否存在。但是,我的代码在遇到无效的变量名时停止执行。

我知道我混合了 Java 和 Stata 编码,这是完全不合适的,但有什么办法可以做类似的事情:

try {
su var1
local var1_mean=(mean)var1
local var1_min=(min)var1
local var1_max=(max)var1
...
}
catch (NoSuchVariableException e) {
System.out.println("Var1 does not exist")
}
// So that the code does not stop executing...?

【问题讨论】:

    标签: java try-catch stata


    【解决方案1】:

    您还可以通过在调用中添加nostop 选项来阻止do 文件的执行在发生错误时停止:

    do myfile, nostop

    【讨论】:

    • 正确。我不得不说我从来没有看到太多指向这个功能。当且仅当失败对随后发生的任何事情都没有后果时,这是一个好主意,根据我的经验,这对于任何实质性代码都是不寻常的。
    【解决方案2】:

    简短的回答是肯定的。稍长一点的答案是,通过类比 Java 来猜测语法可能是什么,成功的机会很小。最好阅读 Stata 的文档,例如首先浏览 [P] 手册中的主要条目。

    这里被困的问题是不存在var1。这段代码是合法的,至少我相信:

    capture su var1, meanonly 
    
    if _rc == 0 { 
         local var1_mean = r(mean)
         local var1_min  = r(min)
         local var1_max  = r(max)
    }
    else display "var1 does not exist"
    

    这个想法是双重的。 capture 吃掉它作为前缀的命令的任何错误,但在 _rc 中仍然可以访问返回码。非零返回码是错误码。

    一个相关的命令是confirm,例如

    capture confirm var var1 
    

    检查变量var1 是否存在。

    【讨论】:

    • 非常感谢。实际上,我一直在搜索 Stata 手册中的关键字 try...我认为这应该是检查变量存在的自然方式(也许 b/ci 对 java 更熟悉)...然后我得到了又累又沮丧……所以我决定问真正的专业人士:)
    • Stata 的起源早于 Java,因此任何相似的语法都必须反映意外或共同的灵感来源。但 Stata 从未承诺过其他任何事情。它在很多事情上都使用自己的话。
    • 一个不那么冗长的替代方案是“捕获噪音”。这还具有不必提供您自己的错误解释的优点。
    • @biased_estimator 那确实会更短。更大的问题是,您建议的较短代码只会在出错时中止程序,而答案 (a) 解释了 OP 在问题中似乎要求的构造,并且 (b) 指出了分支代码的方式,即在这里以及更重要的其他地方可能是更大的目标。
    【解决方案3】:

    一种方法是简单地将代码插入命令行。注意:你需要先准备好,然后复制粘贴到命令行中。假设您有两个变量,var1 && var2,并且您的第一个文件不存在 var1,那么:

    选项 1. 您的 .do 文件是:

    su var1
    su var2
    ...
    

    当您尝试执行它时,您会得到以下信息: variable var1 is not found //所有代码都停止了

    选项 2. 您可以将同一行复制粘贴到命令字段中:

    su var1
    su var2
    ...
    

    结果是:

    . variable var1 is not found
    . sum var2
    
        Variable |       Obs        Mean    Std. Dev.       Min        Max
    -------------+--------------------------------------------------------
           var2 |     5              39     26             1         8
    
    . 
    

    【讨论】:

    • 这里的提议似乎是 Stata 会告诉你你的代码是否做出了错误的假设。就是这样,但我怀疑这是否解决了发布的问题。特别是,默认情况下,一旦出现错误,do-files 就会停止。交互发生的事情不是问题。
    • 这个解决方案并不能完全解决我的问题:(
    猜你喜欢
    • 1970-01-01
    • 2016-02-19
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多