日誌是什麼?
提供SAS程式執行過程的資訊
用來辨別程式執行流程、來源與產出資料集等資訊
日誌 – Log
SAS日誌包含2種資訊:
- 程式碼記錄(黑字):所有我們所提交的程式碼紀錄,以及SAS內建的選項(因執行平台而異,例:SAS BASE、SAS EG、SAS Studio等)
- 程式反饋訊息(紅字、黃字、藍字):紀錄程式碼在執行後的狀況摘要,可以分為錯誤、警告、附註共3種
錯誤 – Error
當提交程式後,發生不符規SAS則或是其他條件時自動產生的錯誤資訊,多數情況下程式會被迫停止執行
發生在編譯階段(Compile Phase)與執行階段(Execution Phase)之一
類型
語法錯誤 (Syntax error)
提交的語法、敘述句不符合SAS規則或是不存在
- 函數、Call Routines、關鍵字或敘述句拼寫錯誤
- 不對稱的單、雙引號
- 未在敘述句結尾放上「分號(;)」
- 不正確使用Data Set選項
上面語法中,就是最典型的函數名稱輸入錯誤,正確用法應該是輸入「sum」,而不是「sun」
語意錯誤 (Semantic error)
語法、敘述句使用正確,但用法在當前狀況不適用
- 函數、Call Routines放入錯誤的參數數量
- 矩陣(Array)引用無效的變數
上面語法中,發生函數參數數量輸入的錯誤,Today()函數不需放入任何參數
執行時錯誤 (Execution-time error)
SAS在執行階段(Execution Phase)時發生的錯誤
- 無效的數學計算
- 執行時資源不足,例:記憶體、I/O不足
這段語法中,出現無效的數學計算錯誤,咦?在哪裡?注意藍字之間的黑字
這個錯誤比較特別,它的錯誤是被記錄到_ERROR_這個自動變數之中,而不是在日誌中出現!
發生此錯誤時,_Error_被設為1,並且在第二個NOTE中告知了我們錯誤發生的程式碼為第幾行
資料錯誤 (Data error)
SAS在處理資料時的錯誤
這段語法中,發生了與「執行時錯誤」範例類似的錯誤
在建立資料時,輸入了不符合變數屬性的值,分別是第1筆的AB(變數為數值)、第3筆的MN(變數為數值)
巨集相關錯誤 (Macro-related error)
不當使用巨集變數、函數、程式等所產生的錯誤
這段語法中,出現不當的巨集程式錯誤,因為在該巨集程式中的敘述句並沒有以分號(;)結尾
警告 – Warning
當提交程式後,SAS在執行過程的日誌中列出警告,但此時程式仍會繼續執行
相較於錯誤,並不會嚴重影響程式執行,但在進行資料轉換與處理時,警告仍不可忽視,因為可能會影響到處理的資料
這段語法同時發生了1個錯誤與1個警告
因為Library「Mylib」不存在,所以在讀取資料時先跳出錯誤,隨後因為沒有讀取到資料,而無法建立test這個資料集,此時彈出警告表示「我們所建立的test資料集並不完整」
附註 – Note
只要執行一般程式碼都會在日誌中出現附註,例外情形是更改全域的選項、建立巨集變數及程式時,並不會跳出附註
表示程式執行順利且無害,通常會夾帶一些資料集的使用筆數與變數、執行時間等訊息
調整日誌資訊
除了SAS內建的日誌規格以外,其實我們也能改變日誌給我們的資訊
內建
SAS內建能修改日誌的方式是透過調整全域的「選項(Option)」
Options <Option Name>;
上方是修改全域選項的語法,由Options關鍵字與所需的選項名稱、參數結合而成
下面列出幾個我較常使用、與日誌有關的全域選項:
NOTES | NONOTES | 指定是否將附註打印在日誌中 |
ERRORS= <n | nK | nM | nG | nT> | 指定發生錯誤的最大觀察值數量 |
Symbolgen | Nosymbolgen | 使用巨集時,指定是否將解析的巨集變數打印在日誌 |
Mprint | Nomprint | 使用巨集時,指定是否將追蹤過程所解析的巨集程式打印在日誌 |
Mlogic | Nomlogic | 使用巨集時,指定是否將追蹤的巨集程式、巨集判斷敘述句的結果打印在日誌 |
自訂
除了SAS內建的日誌以外,有時候可能想要在特定條件觸發時,把資訊寫到日誌中,這時候就可以透過「PUT敘述句」與「巨集%PUT敘述句」的方式來達到此目的
PUT敘述句:
Data test;
PUT 'ERROR: Something is wrong in my life.';
PUT 'WARNING: There is a police ambush under the red light ahead.';
PUT 'NOTE: When you look long into an abyss, the abyss looks into you.';
run;
需在Data Step中進行使用,可以搭配IF敘述句來控制、打印資訊到日誌中
※注意:上面的「ERROR:」、「WARNING:」、「NOTE:」必須為大寫才會生效
巨集%PUT敘述句:
%PUT ERROR: Something is wrong in my life.;
%PUT WARNING: There is a police ambush under the red light ahead.;
%PUT NOTE: When you look long into an abyss, the abyss looks into you.;
雖然還沒介紹到巨集,但其實用法很簡單,把巨集當成跳脫在Data Step與Proc Step外的物件就行
※注意:上面的「ERROR:」、「WARNING:」、「NOTE:」必須為大寫才會生效
通常巨集%PUT敘述句可以搭配巨集%IF敘述句來進行使用,藉此在不同程式段落間產出所需的日誌、優化DEBUG的效率、自動寄送錯誤日誌Email等
參考資料:
謝謝閱讀這篇文章,有問題歡迎在下方留言