【问题标题】:Error handling on sockets in SAS under OpenVMSOpenVMS 下 SAS 中套接字的错误处理
【发布时间】:2009-04-27 11:32:28
【问题描述】:

我在 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 时尚中,问题在过去几天没有出现,所以我不确定最终的解决方案是什么。 [/update1]

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

[更新3] 我已经运行了几天的一些代码,现在可以运行了。另一个问题是(当然)如果&syserr 的值高于6,则会发生错误情况,因此根据您的errorabend/noerrorabend 设置,这会导致程序完全结束,或者导致程序继续使用@ 987654328@ 处于语法检查模式。两者都是不可取的。解决方案是在产生此错误的数据步之前设置options noerrorabend nosyntaxcheck。此外,如果发生错误,我必须清除文件名 extsrc 并重新分配它。最后,一旦这段代码完成,我就会恢复错误结束。如果我恢复 nosyntaxcheck,这会导致 SAS 检测到先前的错误条件并在该点切换到 syntaxcheck 模式,这也是不可取的。 [/update3]

【问题讨论】:

标签: sockets error-handling sas openvms


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

你能测试一下数据 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;

【讨论】:

  • 是的,这确实是我的计划,但首先我需要一些方法来可靠地检测数据集 foo 不存在的原因是这个套接字问题。如果有其他问题,我仍然想可靠地出错。
  • 能否结合测试数据是否存在和如果数据不存在则解析错误。因此,如果数据不存在并且错误不是您所期望的,那就死吧..?顺便说一句,不要忘记限制循环的迭代次数。我上面的例子没有这样做。
【解决方案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 ;

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    相关资源
    最近更新 更多