我在 OpenVMS 上使用 SAS 9.2 通过使用文件名语句指定的套接字连接到外部数据源:
filename extsrc SOCKET "extserver:port" recfm=v;
data foo;
infile extsrc;
input;
.... some statements to read stuff ...;
run;
这在 99% 的时间里都有效(应该如此)。但是,有时应该在远程端口上侦听的程序却不是。目前这会导致程序退出并出现错误:
Error: Connection refused.
之后我们再试一次,它通常可以工作。但是,这变得乏味,所以我想在程序中检测到这个错误并在那里处理它。有人知道在 SAS 中检测此类错误的方法吗?
我尝试使用 fileref() 函数检查 fileref extsrc 的有效性,但这只是返回 -20005 ,这意味着 fileref 已分配但不指向本地文件(这是真的)。只有当我在数据步骤中使用 fileref 时,错误才会变得明显,所以我想做一些类似的事情:
data _null_;
rc=infile extsrc;
if rc=0 then do;
//whatever I want to do;
end;
else do;
//throw some error and try again later;
end;
run;
[update1] 我正在尝试下面的建议,但在真正的heisenbug时尚中,问题在过去几天没有出现,所以我不确定最终的解决方案是什么。[/更新1]
[update2] 错误终于又出现了。根据 cmjohns 的回答,发生此错误后 syserr 的值为 1012 。我现在将观察 syserr 的值,如果失败,则重试固定次数。[/更新2]
[update3] 我已经运行了几天的一些代码,现在可以运行了。另一个问题是(当然)如果&syserr
获得的值高于 6,则会发生错误情况,因此根据您的errorabend/noerrorabend
设置,这会导致程序完全结束,或者导致程序以obs=0
syntaxchek 模式继续。两者都是不可取的。解决方案是options noerrorabend nosyntaxcheck
在产生此错误的数据步之前设置。此外,如果发生错误,我必须清除文件名 extsrc 并重新分配它。最后,一旦这段代码完成,我就会恢复错误结束。如果我恢复 nosyntaxcheck,这会导致 SAS 检测到先前的错误情况并在该点切换到 syntaxcheck 模式,这也是不可取的。[/更新3]