我使用OpenVMS上SAS 9.2连接到在具有一个文件名语句specifed插座的外部数据源:

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在datastep变得明显,所以我喜欢做沿着的路线的东西:

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 时尚问题未能突然出现在过去的几天里,所以我不知道最终的解决办法是什么呢。 [/ UPDATE1]

[UPDATE2] 该错误终于再次出现了。按照cmjohns答案,SYSERR的值是1012,就会出现此错误后。我现在会看SYSERR的值,然后再试一次的固定次数,如果它失败。 [/ UPDATE2]

[UPDATE3] 我有一些代码了一个现在几天,工程运行。附加的问题是,(当然)如果&syserr获得高于6的错误条件已发生的值,所以根据您的errorabend/noerrorabend设置这将导致程序完全结束,或者导致程序继续在syntaxchek模式obs=0。两者都是不可取的。该解决方案是产生这种错误的datastep之前设置options noerrorabend nosyntaxcheck。此外,如果发生错误我要明确的文件名extsrc并重新分配它。最后,一旦这段代码是完全恢复我errorabend。如果我恢复nosyntaxcheck这导致SAS检测以前的错误条件,并切换在该点这也是不希望到syntaxcheck模式。 [/ UPDATE3]

有帮助吗?

解决方案

您是否尝试过测试和SYSERR的价值。任何不为0通常表示一个问题。

您可以看到返回值这里。通过列表来看我猜一个1012或1020是套接字错误时,你做了什么。

其他提示

你能测试数据FOO?如果没有数据,那么你可以设置一个重试循环,是否存在的数据,是否继续?

是这样的:

  

doitagain:

     

(此处插入的插座代码)

/*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;

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

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 ;
scroll top