&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。