Stata是否有类似Java的“try and catch”机制?

我正在写一个.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来猜测语法可能是成功的最小机会。 最好阅读Stata的文档,例如,首先浏览[P]手册中的主要条目。

这里var1的问题是不存在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它前缀命令的任何错误,但是仍然可以在_rc访问返回码。 非零返回码是错误代码。

相关命令是confirm ,例如

 capture confirm var var1 

检查变量var1存在。

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

do myfile, nostop

一种方法是简单地在命令行中插入代码。 注意:您需要先准备它,然后将其粘贴到命令行中。 假设您有两个变量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 .