带你读《SAS数据分析开发之道 软件质量的维度》第三章通信交流3.2系统数字返回码(六)

&SYSRC

&SYSRC自动宏变量能够记录与OS 运行环境直接进行互动的程序指令的状态,如X、SYSEXEC、SYSTASK及 WAITFOR。尽管本书中未详细介绍, 但 &SYSRC在这些程序指令成功完成之后会显示一个“0”值。由于&SYSRC在后续X、SYSEXEC、 SYSTASK 或类似程序指令运行之前不能进行重置,而且该宏变量是可读写的,因此,在评估之前需要手动重置该变量的值,这一点与 &SYSCC的初始化类似。

以下内容说明的是Windows运行环境中 程序指令获得初步成功,该指令的目的是将当前文件夹的内容输入到文本文件Dir.txt,随后是一个因DOS命令“DIR”错误拼写为“DIRT”而造成的故障:

%letsysrc=0;

%letsyscc=0;data_null_;

x"dir>dir.txt";run;

 

NOTE:DATAstatementused(Totalprocesstime):realtime   1.66seconds

cputime               0.07seconds


%putSYSRC:&sysrc;SYSRC:0

%putSYSCC:&syscc;

SYSCC:0

data_null_;

x"dirt>dir.txt"

!;

run;

 

NOTE:DATAstatementused(Totalprocesstime):realtime   0.77seconds

cputime               0.07seconds

 

%putSYSRC:&sysrc;SYSRC:9009

%putSYSCC:&syscc;

SYSCC:0

 

&SYSCC返回码不受 &SYSRC值的影响,因此,必须通过评估 &SYSRC处理这些程序指令中的异常情况。&SYSRC宏变量在第 12 章“自动化”的“批量异常情况处理”部分讲述,它用于异常情况处理框架中显示 SYSTASK 程序指令的顺利运行。

 

SYSRC()

不要将SYSRC() 函数与&SYSRC自动宏变量混淆,它返回的是最近运行的输入/输出(I/O)函数的完成状态。由于 I/O函数通常是在%SYSFUNC宏函数中执行的,因此,SYSRC() 值可被保存为一个宏变量,并且可用于驱动异常情况处理的程序流。

以下代码及输出信息显示的是 Final数据集中变量的数量 :

%letdsid=%sysfunc(open(perm.final,i));

%letvars=%sysfunc(attrn(&dsid,nvars));

%letclose=%sysfunc(close(&dsid));

 

%putVARS:&vars;VARS:1


然而,由于 OPEN函数需要 PERM.Final 数据集的共享锁定,因此,如果某个独立的用户或 SAS 会话独自锁定该数据集,该代码便会出现故障 :

%letdsid=%sysfunc(open(perm.final,i));

%letvars=%sysfunc(attrn(&dsid,nvars));

WARNING:Argument1tofunctionATTRNreferencedbythe%SYSFUNCor%QSYSFUNCmacrofunctionisoutofrange.

NOTE:Mathematicaloperationscouldnotbeperformedduring%SYSFUNCfunctionexecution.Theresultoftheoperationshavebeensettoamissingvalue.

%letclose=%sysfunc(close(&dsid));

 

%putVARS:&vars;VARS:

若 OPEN发生故障,&DSID便不会被赋值, 因此,ATTRN函数随后也会发生故障。补救措施是在执行类似 ATTRN或 CLOSE等后续相关动作之前,使用SYSRC函数测试I/O函数的返回码(与OPEN相似),由于I/O函数正常运行时返回的是“0”,因此,以下代码仅在OPEN顺利运行的前提下执行ATTRN:

%macrotest;

%letdsid=%sysfunc(open(perm.final,i));

%if%sysfunc(sysrc())=0%then%do;

%letvars=%sysfunc(attrn(&dsid,nvars));

%letclose=%sysfunc(close(&dsid));

%end;

%else%letvars=FAILURE;

%putVARS:&vars;

%mend; 

%test;

实现类似程序控制的另一个方法是在OPEN函数之后立即测试&DSID,如果值是“0”(表示打开该数据集出现故障),则终止该过程。

上一篇:阿里云服务器配置301重定向教程


下一篇:spring事物配置,声明式事务管理和基于@Transactional注解的使用