7

我在 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=0syntaxchek 模式继续。两者都是不可取的。解决方案是options noerrorabend nosyntaxcheck在产生此错误的数据步之前设置。此外,如果发生错误,我必须清除文件名 extsrc 并重新分配它。最后,一旦这段代码完成,我就会恢复错误结束。如果我恢复 nosyntaxcheck,这会导致 SAS 检测到先前的错误情况并在该点切换到 syntaxcheck 模式,这也是不可取的。[/更新3]

4

3 回答 3

5

您是否尝试过测试 &syserr 的值。任何不为 0 的值通常表示存在问题。

您可以在此处查看返回值。从列表来看,我猜 1012 或 1020 是您在套接字错误期间得到的。

于 2009-04-27T20:58:23.053 回答
3

您可以测试数据 foo 吗?如果没有数据那么你可以设置一个重试循环,如果数据存在,继续?

就像是:

再来一遍:

(在此处插入您的套接字代码)

/*see if ds exists*/

%if not %sysfunc(exist(data.foo)) %then %do ;

/*if the ds does not exist then*/

%put WARNING: The file does not exist! ;

%goto doitagain;

%end;
于 2009-04-28T13:52:28.217 回答
3

我知道这是一个陈旧的线程,但是:

SYNTAXCHECK 很不错;而不是因为 &syserr (实际上是 &syscc) 问题而裸奔,一旦你通过了代码的敏感部分,你可以将它清除为最后已知的良好值。

以下是当我不得不优雅地处理来自 DB2 的锁定表错误时的相关代码:

/*** temporarily disable ERRORABEND and SYNTAXCHECK ***/
options NOERRORABEND NOSYNTAXCHECK ;

/* save &syscc for laster restoration */
%let presyscc=&syscc;

%do until (...);
  /* do a task, handle some possible errors */
%end;

/* restore &syscc */
%let syscc=&presyscc;

/*** re-enable ERRORABEND and SYNTAXCHECK ***/
options ERRORABEND SYNTAXCHECK ;
于 2009-08-07T19:10:35.253 回答