sockets - OpenVMS 下 SAS 中套接字的错误处理

标签 sockets error-handling sas openvms

我在 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/

相关文章:

sas - 在sas中设置具有相似名称的多个数据集

java - 当socketChannel.read(BUFFER)将返回0时

java - InputStream 哪个更快 read() 或 read(byte,offset,length)

使用迭代查找最大值和最小值时出现 Python TypeError

url - YII 1 错误和异常处理

sas - 这个程序到底在做什么? (SAS)

sas - 如何将宏函数的结果分配给SAS中的宏变量?

java - java.nio 的非阻塞选择问题

java - 在java中发送一个int。有时会引发异常?

javascript - JavaScript 能否捕获由页面对象触发的 404 错误?