Есть ли способ заставить SAS остановиться при первом предупреждении или ошибке?
SAS любит продолжить обработку после предупреждений и ошибок, поэтому мне часто приходится прокручивать назад страницы в журнале, чтобы найти проблему. Есть ли способ лучше? Я бы хотел, чтобы он остановился, как только появится первая ошибка или предупреждение, поэтому я могу исправить ее и повторить попытку.
Ответы
Ответ 1
Ранее предлагалась опция ERRORS = 1, но это только останавливает сообщения ERROR от записи в журнал. Я бы предложил другой системный параметр 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.
Ответ 2
Один из вариантов заключается в замене run
на run &g_cancel
всюду и proc sql;
на proc sql &g_noexec;
. Первоначально &g_cancel
и &g_noexec
не имеют ничего общего, поэтому все выполняется.
При попадании на ошибку (либо %sys_rc
, %sql_rc
, либо используя ссылку на бизнес-логику) установите &g_cancel
для отмены и &g_noexec
в noexec.
Это должно остановить любые последующие шаги от запуска - очевидно, макропроцессоры могут быть опущены для шагов, которые должны выполняться независимо (например, в порядке) или проверены перед выполнением шагов исключительно в макросе.
Примечание для пользователей Enterprise Guide: Единственное предупреждение - это то, что если вы используете несколько элементов кода в одном сеансе, вам нужно reset условия ошибки в начале каждого элемента кода, чтобы не связанные с ними ошибки не прекратили ничего работающего,
Ответ 3
Недавно я использовал макрос %runquit
. Хорошо работает как для пакетных заданий, так и для интерактивных сеансов (не закрывает сеанс, просто перестает работать с кодом).
Источник: http://www.cpc.unc.edu/research/tools/data_analysis/sas_to_stata/sas-macros/runquit.html
Чтобы использовать его, вы в основном набираете %runquit;
в конце любого шага данных или PROC вместо ввода обычного оператора run
или quit
.
код:
%macro runquit;
; run; quit;
%if &syserr. ne 0 %then %do;
%abort cancel;
%end;
%mend runquit;
Использование Datastep:
data something;
* do some stuff;
%runquit;
Использование PROC:
proc sql;
* do some stuff;
%runquit;
Это не так хорошо, когда вы читаете код, но он делает отладку намного проще.
Ответ 4
Я часто делаю что-то похожее на RWill, но я переношу всю свою программу в макрос. После каждого этапа DATA, PROC SQL, PROC SORT и т.д. Я проверяю код ошибки (& SYSERR или SQLRC). Если он отличен от нуля, я перехожу к концу.
Подробнее и код здесь: https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/
Я не могу использовать концы RWill из-за того, как наша система пакетной организации работает с независимыми программами в одном сеансе SAS.
Ответ 5
В качестве дополнения к ответу Rwill:
Если вы используете хранимый процесс (STP), также приятно не показывать журнал вашим пользователям при возникновении ошибки и удалять кнопку "Показать журнал SAS".
Это может быть достигнуто с помощью этого
%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;