海外のプログラムみてるとよくこの書き方してるなーっていう定石を紹介。
まずは以下の記事で、ログに独自のERROR, WARNING, NOTEメッセージを表示する方法を紹介済みなのでご覧下さい。
ログに独自のエラーメッセージを表示する。
たとえば以下のように、
データステップの場合はPUTを使い、マクロの場合は%PUTを使って独自のログメッセージを表示できます。
データステップの場合
data _null_; A = 1; if A = 1 then put "ERROR: 変数 A が 1 じゃダメ!!"; run; ログ 36 A = 1; 37 if A = 1 then put "ERROR: 変数 A が 1 じゃダメ!!"; 38 run; ERROR: 変数 A が 1 じゃダメ!! NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 |
マクロの場合
%macro TEST(A=);
%if "&A" = "1" %then %put ERROR: マクロ変数 A が 1 じゃダメ!!; %mend; %TEST(A=1) ログ 34 %macro TEST(A=); 35 %if "&A" = "1" %then %put ERROR: マクロ変数 A が 1 じゃダメ!!; 36 %mend; 37 38 %TEST(A=1) ERROR: マクロ 変数 A が 1 じゃダメ!! |
ただし、1つ問題があります。
みなさん、プログラム実行後のログに対して 「ERROR」 や 「WARNING」などのキーワードで検索かけて問題となるメッセージがないかを確認しますよね。
その際、上のログ2行目の「35 %if "&A" = "1" %then %put ERROR: マクロ変数 A が 1 じゃダメ!!;」には「ERROR」という文字を含んでいるため検索にひっかかってしまいます。
検索かけたいのは 実際に発生したエラーだけなので、これは無視したいですよね。
そこで以下のように "E" "RROR" という感じで文字を区切って検索にひっかからないようにします。
data _null_; A = 1; if A = 1 then put "E" "RROR: 変数 A が 1 じゃダメ!!"; run; ログ 35 data _null_; 36 A = 1; 37 if A = 1 then put "E" "RROR: 変数 A が 1 じゃダメ!!"; 38 run; ERROR: 変数 A が 1 じゃダメ!! NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 |
また%PUTの場合も、 %str(E)RROR と書いて検索にひっかからないようにします。
%macro TEST(A=);
%if "&A" = "1" %then %put %str(E)RROR: マクロ変数 A が 1 じゃダメ!!; %mend; %TEST(A=1) ログ 34 %macro TEST(A=); 35 %if "&A" = "1" %then %put %str(E)RROR: マクロ変数 A が 1 じゃダメ!!; 36 %mend; 37 38 %TEST(A=1) ERROR: マクロ 変数 A が 1 じゃダメ!! |
%strをダミーで使ってる感じですね。
前々からの悩みでした。素晴らしい!
返信削除コメント有難うございます!
返信削除この問題はSASプログラマー共通の悩みでしたよね。