Есть ли способ заставить 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;