有没有办法让SAS在第一次警告或错误时停止?

时间:2012-01-25 19:34:05

标签: sas

SAS喜欢在发出警告和错误后继续处理,因此我经常需要向后滚动日志中的页面以查找问题。有没有更好的办法?我希望它在第一个错误或警告出现后立即停止,以便我可以修复它并再试一次。

5 个答案:

答案 0 :(得分:15)

之前建议使用ERRORS = 1选项,但这只会阻止E​​RROR消息写入日志。我建议另一个系统选项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以外的任何地方终止。

答案 1 :(得分:4)

我最近一直在使用%runquit宏。适用于批处理作业和交互式会话(不会关闭会话,只是停止运行代码)。

来源:http://www.cpc.unc.edu/research/tools/data_analysis/sas_to_stata/sas-macros/runquit.html

要使用它,您基本上在任何数据步骤或PROC的末尾键入%runquit;,而不是键入常规的runquit语句。

代码:

%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;

在阅读代码时,它并不那么漂亮,但它确实使调试变得更加容易。

答案 2 :(得分:3)

一种选择是将run全部替换为run &g_cancel,将proc sql;替换为proc sql &g_noexec;。最初&g_cancel&g_noexec设置为空,所以一切都运行。

在遇到错误(%sys_rc%sql_rc或使用引用业务逻辑)时,将&g_cancel设置为取消,将&g_noexec设置为noexec。

这应该阻止任何后续步骤运行 - 显然,对于必须运行的步骤(例如整理)或在执行纯粹在宏中执行的步骤之前,可以省略宏变量。

企业指南用户注意事项:唯一的警告说明如果您在同一会话中运行多个代码项,则需要在每个代码项的开头重置错误术语,以免无关的错误阻止任何工作。

答案 3 :(得分:2)

我经常做类似于RWill的事情,但是我将整个程序包装在一个宏中。在每个DATA步骤,PROC SQL,PROC SORT等之后,我检查错误代码(&amp; SYSERR或&amp; SQLRC)。如果它不为零,我跳到最后。

更多详细信息和代码:https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/

由于我们组织的批处理系统在一个SAS会话中运行独立程序,我无法使用RWill的结尾。

答案 4 :(得分:2)

作为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;