&SYSERRORTEXT
&SYSERRORTEXT 自动宏变量是特殊的,对它进行介绍的唯一理由是尽量避免使用它。它包括当前 SAS会话中生成的或打印到 SAS日志中的最近一次错误信息的文本。一个错误信息并不表示出现了真正的“运行时错误”。例如,用 %PUT程序指令打印“ERROR:FAKE”将导致&SYSERRORTEXT改变为FAKE,如以下输出信息所示。
%putBEFORE:&syserrortextLENGTH:%length(&syserrortext);BEFORE: LENGTH:0
%putERROR:FAKE;ERROR:FAKE
%putAFTER:&syserrortextLENGTH:%length(&syserrortext);
AFTER:FAKE LENGTH:4
下面的输出信息显示的是实际产生的“运行时错误”,该错误是因为LENGTH程序指令中增加的美元符号造成了语法错误。由于 &SYSERRORTEXT 宏变量是只读的,而且仅在新的错误出现时重置,因此,它无法手动重置为丢失的。
%putBEFORE:&syserrortextLENGTH:%length(&syserrortext);
BEFORE: LENGTH:0
datafinal;
lengthchar$$10;
-391
76
ERROR391-185:Expectingavariablelengthspecification.ERROR76-322:Syntaxerror,statementwillbeignored.run;
NOTE:TheSASSystemstoppedprocessingthisstepbecauseoferrors.WARNING:ThedatasetWORK.FINALmaybeincomplete.Whenthisstepwasstoppedtherewere0observationsand0variables.
NOTE:DATAstatementused(Totalprocesstime):realtime 0.08seconds
cputime 0.06seconds
%putAFTER:&syserrortext LENGTH:%length(&syserrortext);
AFTER:76-322:Syntaxerror,statementwillbeignored. LENGTH:48
&SYSERRORTEXT的另一个警告是它仅能捕获最后的“运行时错误”,而某些缺点会产生多个连续的“运行时错误”。在本例中,增加的美元符号会造成两个连续的错误(“391-185”及“76-322”),因此,若在DATA步骤之后立即评估 &SYSERRORTEXT,则只有第二个错误“语法错误,忽略程序指令将会—被保留 下来。这非常令人遗憾,因为第一个错误程序指令相对更加有信息性:“希望获得一个变量长度规格”。
另外,&SYSERRORTEXT还能隐藏 &SYSWARNINGTEXT的使用。如前面“&SYSWARNINGTEXT”部分所述。&SYSWARNINGTEXT 应该仅在两种情况下被评估 :在程序启动之前&SYSCC重置以及在程序完成之后 &SYSCC=4时。在本例中,由于除了警告之外,还出现了错误,&SYSCC 被赋予了较高的错误值,而非警告值“4”;从编程方式来看,没有办法确定&SYSWARNINGTEXT的值是当前的、相关的,因为 &SYSCC设置为一个错误代码,而不是一个警告代码。
与 &SYSWARNINGTEXT类似,&SYSERRORTEXT的值会保留在整个SAS会话中,因此,不相关的 &SYSERRORTEXT 值将会影响后续不相关的程序。例如,执行完上述代码之后,一个独立的程序会执行 DATA步骤,并在不出现任何“运行时错误”的情况下成功创建FINAL2数据集,&SYSERR和&SYSCC的值均为“0”便显示出该程序未出现任何错误。然而,原始程序中 &SYSERRORTEXT 的值会保留在输出信息中,因为这个只读的宏变量无法重置。
%letsyscc=0;
datafinal2;
lengthnum8;run;
NOTE:ThedatasetWORK.FINAL2has1observationsand1variables.NOTE:DATAstatementused(Totalprocesstime):
realtime 0.03seconds
cputime 0.03seconds
%putSYSERR:&syserr;SYSERR:0
%putSYSCC:&syscc;SYSCC:0
%putSYSWARNINGTEXT:&syswarningtext;
SYSWARNINGTEXT:DatasetWORK.FINALwasnotreplacedbecause
thisstepwasstopped.
%putSYSERRORTEXT:&syserrortext;
SYSERRORTEXT:76-322:Syntaxerror,statementwillbeignored.
为了克服最后一个缺点并确保&SYSERRORTEXT仅在恰当的时候被评估,代码应该仅在两种情况下引用 &SYSERRORTEXT:&SYSCC>4以及在程序启动之前 &SYSCC立即重置。由于存在前述介绍的许多缺点且作用有限,不推荐使用&SYSERRORTEXT。