Есть ли способ остановить SAS после первого предупреждения или ошибки? - PullRequest
19 голосов
/ 25 января 2012

SAS любит продолжать обработку после предупреждений и ошибок, поэтому мне часто приходится прокручивать страницы в журнале, чтобы найти проблему. Есть ли способ лучше? Я бы хотел, чтобы он прекратился, как только появится первая ошибка или предупреждение, чтобы я мог исправить это и повторить попытку.

Ответы [ 5 ]

15 голосов
/ 26 января 2012

Опция 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.

4 голосов
/ 13 июля 2015

Я недавно использовал макрос %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;

Это не так красиво при чтении кода, но делает отладку намного проще.

3 голосов
/ 15 июля 2013

Один из вариантов - заменить 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. Единственное предупреждение: если вы запускаете несколько элементов кода в одном и том же сеансе, вам нужно будет сбросить условия ошибок в начале каждого элемента кода, чтобы не связанные с этим ошибки ничего не остановилиза работой.

2 голосов
/ 25 августа 2017

В качестве дополнения к ответу 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;
2 голосов
/ 10 февраля 2012

Я часто делаю что-то похожее на RWill, но всю свою программу я оборачиваю в макрос. После каждого шага DATA, PROC SQL, PROC SORT и т. Д. Я проверяю код ошибки (& SYSERR или & SQLRC). Если это не ноль, я прыгаю до конца.

Подробнее и код здесь: https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/

Я не могу использовать концы RWill из-за того, что пакетная система нашей организации запускает независимые программы в одной сессии SAS.

...