天天看點

帶你讀《SAS資料分析開發之道 軟體品質的次元》第三章通信交流3.4使用者生成的傳回碼(二)

帶外信号

帶外傳回碼比帶内傳回碼更常見、更有用,因為以下兩種情況界限分明   :一個值是有效資料和性能中繼資料可反映出一個錯誤或故障。另外,由于該傳回碼依然表示一個通用宏變量,該變量必須初始化和重置,是以,空白傳回碼表明某個過程未遇到任何警告或“運作時錯誤”。帶外信号唯一的缺點可能是必須建立附加的宏變量以傳遞 該傳回碼。

“帶内信号”部分所舉的帶内傳回碼案例稍作修改即可展示帶外信号。在本例中,&VARS     現在僅代表資料集中變量的數量,不再傳達性能故障。是以,如果出現異常情況,&VARS依然是丢失的(而不是設定為FAILURE)。

%macrotest;

%globalvars;

%letvars=;

%globaltestrc;

%lettestrc=GENERALFAILURE;

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

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

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

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

%lettestrc=;

%end;

%else%lettestrc=FAILURE;

%mend;

%test;

%putVARS:&vars;

%putTESTRC:&testrc;

帶外傳回碼的另一個優點是當空的宏變量用于表示正常運作時,%LENGTH   宏函數将用于評估是否出現了異常情況,因為傳回碼的長度在正常運作情況下是“0”。

以下修改顯示的是 %RUNTEST宏,它是調用子 %TEST宏的父程序。如果 %TEST是成功的,%RUNTEST會在 PERM.Final 中列印變量的數量 ;如果不成功,%TEST将在日志中列印一個錯誤。當然,在實際的生産軟體中,異常情況處理架構不會在日志中列印資訊,而是動态地改變以下程式流。

%macroruntest;

%if%length(&testrc)=0%then%putVARS:&vars;

%else%putAnexceptioncausedafailure;

%runtest;

建立帶外傳回碼的邏輯必須確定傳回碼與其所代表程序的宏變量同步。例如,在    上述代碼中,&TESTRC表示 %TEST宏函數的性能,而 &TESTRC能生成 &VARS。是以,它應該與 &VARS完美同步。如果 &VARS包含一個值,&TESTRC就應該是丢失的 ;如果&VARS是丢失的,&TESTRC就應該設定為 FAILURE 或 GENERALFAILURE。

在上述%TEST宏中,如果 ATTRN函數出現異常情況或錯誤,那麼将不會設定 &VARS,是以,它會是空白的。&TESTRC也會是空白的,因為異常情況處理僅測試 OPEN函數的故障而非 ATTRN 的故障。盡管這一故障不可能發生,但這種邏輯錯誤可能會造成故障,兩個宏變量都是空白的。為了解決這一漏洞,可以測試ATTRN函數是否成功,或者測試 &VARS的值以驗證它被有效指派。第 6章進一步講述傳回碼的成功運用。

繼續閱讀