SASは警告やエラーが発生した後も処理を続行するのが好きなので、問題を見つけるためにログのページをスクロールして戻る必要があります。もっと良い方法はありますか?最初のエラーまたは警告が表示されたらすぐに停止して、修正して再試行できるようにします。
ERRORS = 1オプションは以前に提案されましたが、それはエラーメッセージがログに書き込むのを停止するだけです。ほとんどのエラーに対してプログラムがそれ以上処理されないようにする別のシステムオプションERRORABENDをお勧めします。警告により処理を終了するオプションはわかりませんが、次のようなマクロを追加して処理を停止できると思います。
%macro check_for_errors;
%if &syserr > 0 %then %do;
endsas;
%end;
%mend check_for_errors;
data test1;
<data step code>
run;
%check_for_errors;
プログラムの各ステップの後にマクロ呼び出しを繰り返すことができ、エラーコードが0以外の時点で終了するはずです。
最近、%runquit
マクロを使用しています。バッチジョブとインタラクティブセッションの両方でうまく機能します(セッションを閉じず、コードの実行を停止するだけです)。
出典: http://www.cpc.unc.edu/research/tools/data_analysis/sas_to_stata/sas-macros/runquit.html
これを使用するには、通常のrun
またはquit
ステートメントを入力する代わりに、基本的にデータステップまたはPROCの最後に%runquit;
と入力します。
コード:
%macro runquit;
; run; quit;
%if &syserr. ne 0 %then %do;
%abort cancel;
%end;
%mend runquit;
データステップの使用法:
data something;
* do some stuff;
%runquit;
PROCの使用法:
proc sql;
* do some stuff;
%runquit;
コードを読むときはそれほどきれいではありませんが、デバッグがはるかに簡単になります。
1つのオプションは、全体を通してrun
をrun &g_cancel
に置き換え、proc sql;
をproc sql &g_noexec;
に置き換えることです。最初は&g_cancel
と&g_noexec
が何も設定されていないため、すべてが実行されます。
エラーが発生した場合(%sys_rc
、%sql_rc
、またはビジネスロジックの参照を使用)、&g_cancel
をキャンセルに設定し、&g_noexec
をnoexecに設定します。
これにより、後続のステップの実行が停止するはずです。明らかに、マクロ変数は、関係なく実行する必要があるステップ(たとえば、整理)については省略したり、純粋にマクロでステップを実行する前にチェックしたりできます。
エンタープライズガイドユーザーへの注意:唯一の警告注意は、同じセッションで複数のコードアイテムを実行している場合、無関係なエラーが機能を停止しないように、各コードアイテムの開始時にエラー条件をリセットする必要があることです。
Rwillの答えを補足するものとして:
ストアドプロセス(STP)を使用している場合は、エラーが発生したときにユーザーにログを表示せず、[Show SAS log]]ボタンを削除することもできます。
これで達成できます
%macro checkcc;
options obs=max no$syntaxcheck;
%if (&syscc gt 4) %then
%do;
data _null_;
file _webout;
put "<h3>Sorry, your request was not processed successfully.<h3>";
rc = stpsrvset('program error', 0);
run;
%end;
%let syscc=0;
%mend checkcc;
%checkcc;
ソース: http://support.sas.com/kb/16/225.html
そして、これは私がまだjson形式でエラーを表示するために作成した拡張バージョンです。
%macro checkErrors;
options obs=max no$syntaxcheck;
%let old = %sysfunc(stpsrv_header(Content-type, application/json%str(;) charset=utf-8));
%put &=syscc; %put &=syserr; %put &=sysrc; %put &=syswarningtext; %put &=syserrortext;
%if (&syscc gt 4) %then %do;
data _null_;
file _webout;
put '{';
put ' "success":"false"';
put ' ,"message":"' "&syserrortext" '"';
put ' ,"syscc":"' "&syscc" '"';
put '}';
rc = stpsrvset('program error', 0);
run;
%end;
%let syscc=0;
%mend checkErrors;
%checkErrors;
およびHTMLバージョン:
%macro checkErrors_HTML;
options obs=max no$syntaxcheck;
%if (&syscc gt 4) %then %do;
data _null_;
file _webout;
put '<!doctype html> ';
put '<html> ';
put ' <head> ';
put ' <title>Error</title> ';
put ' </head> ';
put ' <body> ';
put ' <h1>An Error Occured</h1>';
put ' <p>' "&syserrortext" '</>';
put ' </body>';
put '</html>';
rc = stpsrvset('program error', 0);
run;
%end;
%let syscc=0;
%mend checkErrors_HTML;
%checkErrors_HTML;
私はRWillに似たようなことを頻繁に行いますが、プログラム全体をマクロでラップします。各DATAステップの後、PROC SQL、PROC SORTなど。エラーコード(&SYSERRまたは&SQLRC)をチェックします。ゼロ以外の場合は、最後にジャンプします。
詳細とコードはこちら: https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/
組織のバッチシステムが1つのSASセッションで独立したプログラムを実行する方法のため、RWillのendsasを使用できません。