错误的OpenVMS下的SAS在操控性上的插座
-
16-09-2019 - |
题
我使用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通常表示一个问题。
其他提示
你能测试数据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 ;