前のページ|次のページ

マクロのデバッグに関する一般情報

層化アプローチでのマクロの開発

マクロ機能は非常に強力なツールであるため、複雑なツールでもあり、大規模なマクロアプリケーションのデバッグに極端に時間がかかって、フラストレーションがたまることがあります。したがって、エラーを最小化するような方法でマクロアプリケーションを開発することは理にかなっています。そうすることで、発生するエラーを可能な限り簡単に検出および修正できます。その最初の手順は、発生する可能性のあるエラーの種類と、発生する状況を理解することです。次に、モジュール化された層化アプローチを使用してマクロを開発します。最後に、システムオプション、自動マクロ変数、%PUTステートメントなど、いくつかの組み込みツールを使用してエラーを診断します。
注: 置換されなかったマクロ名およびマクロ変数に関する特定の重要な警告メッセージを表示するには、SERRORシステムオプションおよびMERRORシステムオプションを必ず有効にしてください。詳細については、マクロのシステムオプションを参照してください。

エラーの発生

ワードスキャナは、プログラムの処理中に&または%の形式のトークンを検出すると、マクロプロセッサを起動して、&または%の後ろに続くトークン名を調べます。マクロプロセッサは、検出したトークンに応じて、次のアクティビティのいずれかを開始します。
  • マクロ変数の置換
  • マクロのオープンコードの処理
  • マクロのコンパイル
  • マクロの実行
エラーは、これらのステージのいずれかが実行されているときに発生する可能性があります。たとえば、マクロ関数名のスペルを間違えたり、必要なセミコロンを付け忘れたりした場合、コンパイル中に構文エラーが発生します。構文エラーは、プログラムステートメントがマクロ言語の規則に従わない場合に発生します。また、スコープの範囲外の変数を参照した場合、マクロ変数置換エラーが発生します。実行エラー(セマンティックエラーとも呼ばれます)は、通常、プログラムロジック内で発生します。たとえば、マクロによって生成されたテキストに間違った論理(間違った順序または予期しない方法で実行されるステートメント)が含まれる場合、実行エラーが発生することがあります。
もちろん、マクロコードに問題がなくても、マクロコード以外のSASコードでエラーが発生しないとも限りません。たとえば、次のようなエラーが発生する場合があります。
  • ライブラリ参照名が未定義
  • オープンコード(つまり、マクロ定義の外部)での構文エラー
  • マクロによって生成されたコード内のタイプミス
通常、番号付きのエラーメッセージは、マクロコード以外のSASコードに関するエラーメッセージです。マクロプロセッサによって生成されたエラーメッセージには、番号は付いていません。

バグのないマクロの開発

どの言語でプログラミングする場合でも、コードをモジュールに分けて開発することは、優れた手法です。つまり、大きな1つのプログラムを記述するのではなく、部品に分けて開発し、各部品を別々にテストしてから、それらを結合する手法です。この手法は、マクロアプリケーションを開発する場合、特に役立ちます。これは、SASマクロには、マクロコードとマクロコードによって生成されるSASコードという2つの部分に分かれた性質があるためです。
マクロコードをサブミットする前に、よくある誤りがマクロコードに含まれていないかどうかを校正するのも良い方法です。
次に、主要なチェック項目の一部を示します。
  • %MACROステートメントと%MENDステートメントに含まれる名前が一致しており、各%MACROステートメントに対応する%MENDステートメントが存在すること。
  • %DOステートメントの数が%ENDステートメントの数と一致すること。
  • 反復する%DOステートメントに対応する、適切な%TO値が存在すること。
  • すべてのステートメントがセミコロンで終わっていること。
  • コメントが正しく始まり、終了しており、一致しない一重引用符を含んでいないこと。
  • マクロ変数参照が&で始まり、マクロステートメントが%で始まっていること。
  • CALL SYMPUTによって作成されたマクロ変数が、それらが作成されたのと同じDATAステップ内で参照されていないこと。
  • 即座に実行されるステートメント(%LETなど)が、DATAステップの条件付きロジックに含まれていないこと。
  • マクロ変数参照の前後で一重引用符を使用していないこと(TITLEステートメントやFILENAMEステートメントなど)。マクロ変数参照を、クォーティングされた文字内で使用する場合、二重引用符で囲まれた文字列内のマクロ変数参照のみが置換されます。
  • マクロ変数値に、算術演算子として解釈できるどのキーワード、文字も含まれていないこと(そのような文字を含める場合は、該当するマクロクォーティング関数を使用してください)。
  • マクロ変数、%GOTOラベル、およびマクロ名が、SASとホスト環境の予約済みキーワードと競合していないこと。
前のページ|次のページ|ページの先頭へ