2017年8月21日月曜日

「PUT」や「%PUT」でログに独自のエラーメッセージを表示するときの定石



海外のプログラムみてるとよくこの書き方してるなーっていう定石を紹介。
まずは以下の記事で、ログに独自のERROR, WARNING, NOTEメッセージを表示する方法を紹介済みなのでご覧下さい。

ログに独自のエラーメッセージを表示する。



たとえば以下のように、
データステップの場合はPUTを使い、マクロの場合は%PUTを使って独自のログメッセージを表示できます。


データステップの場合
data _null_;
     A = 1;
     if A = 1 then put "ERROR: 変数 A が 1 じゃダメ!!";
run;

ログ
35  data _null_;
36       A = 1;
37       if A = 1 then put "ERROR: 変数 A が 1 じゃダメ!!";
38  run;

ERROR: 変数 A が 1 じゃダメ!!
NOTE: DATAステートメント処理(合計処理時間):
      処理時間           0.00 秒
      CPU時間            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 秒
      CPU時間            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をダミーで使ってる感じですね。

2 件のコメント:

  1. 前々からの悩みでした。素晴らしい!

    返信削除
  2. コメント有難うございます!
    この問題はSASプログラマー共通の悩みでしたよね。

    返信削除