海外のプログラムみてるとよくこの書き方してるなーっていう定石を紹介。
まずは以下の記事で、ログに独自の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 秒 |
マクロの場合
%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をダミーで使ってる感じですね。