代码之家  ›  专栏  ›  技术社区  ›  jilles de wit

openvms下sas中套接字的错误处理

  •  7
  • jilles de wit  · 技术社区  · 15 年前

    我在openvms上使用sas 9.2通过用filename语句指定的套接字连接到外部数据源:

    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被分配了,但没有指向本地文件(这是真的)。只有当我在datastep中使用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 时尚这个问题在过去几天没有出现,所以我不确定最终的解决方案是什么。 [和]

    [UpDATE2] 这个错误终于又出现了。根据cmjohns的回答,发生此错误后,syserr的值为1012。我现在将观察syserr的值,如果失败,则重试固定次数。 [/UpDATE2]

    [更新数据3] 我已经有一些代码运行了几天,现在这工作。另外一个问题是(当然)如果 &syserr 获取大于6的值时出现了错误情况,因此取决于 errorabend/noerrorabend 设置此选项将导致程序完全结束,或导致程序继续 obs=0 在syntaxchek模式下。两者都是不可取的。解决办法是 options noerrorabend nosyntaxcheck 在产生此错误的数据步骤之前。另外,如果发生错误,我必须清除filename extsrc并重新分配它。最后,一旦这段代码完成,我将恢复errorabend。如果我恢复nosyntaxcheck,这将导致sas检测到以前的错误情况,并在此时切换到syntaxcheck模式,这也是不可取的。 [/UpDATE3]

    3 回复  |  直到 7 年前
        1
  •  5
  •   cmjohns    15 年前

    您是否尝试过测试&syserr的值。任何不是0的东西通常都表示有问题。

    可以看到返回值 here . 根据列表判断,我猜1012或1020是在套接字错误期间得到的结果。

        2
  •  3
  •   AFHood    15 年前

    你能测试一下数据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;
    
        3
  •  3
  •   Chris L Hamilton    15 年前

    我知道这是个陈词滥调,但是:

    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 ;