【06】日誌能幹嘛?紅黃藍是什麼?

日誌是什麼?

提供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等


參考資料:

Types of Errors in SAS

謝謝閱讀這篇文章,有問題歡迎在下方留言

Categories: Basic