天天看點

帶你讀《SAS資料分析開發之道 軟體品質的次元》第三章通信交流3.3系統字母數字傳回碼(二)

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

繼續閱讀