我在 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;
[更新1] 我正在尝试下面的建议,但实际上是heisenbug时尚这个问题在过去几天里一直没有出现,所以我不确定最终的解决方案是什么。 [/更新1]
[更新2] 错误终于又出现了。根据 cmjohns 的回答,发生此错误后 syserr 的值为 1012。我现在将观察 syserr 的值,如果失败则重试固定次数。 [/更新2]
[更新3]
我已经运行了一些代码几天了,现在可以工作了。另一个问题是(当然)如果 &syserr
得到的值高于 6,就会发生错误情况,因此根据您的 errorabend/noerrorabend
设置,这会导致程序完全结束,或者导致程序在语法检查模式下以 obs=0
继续。两者都是不可取的。解决方案是在产生此错误的数据步骤之前设置 options noerrorabend nosyntaxcheck
。此外,如果发生错误,我必须清除文件名 extsrc 并重新分配它。最后,一旦这段代码完成,我就会恢复 errorabend。如果我恢复 nosyntaxcheck,这会导致 SAS 检测到先前的错误条件并在此时切换到语法检查模式,这也是不可取的。
[/更新3]
最佳答案
您是否尝试过测试 &syserr 的值?任何不为 0 的值通常都表明存在问题。
可以看到返回值here 。从列表来看,我猜测 1012 或 1020 是您在套接字错误期间得到的结果。
关于sockets - OpenVMS 下 SAS 中套接字的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/793127/