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

问题描述:

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

+0

我看到SO域问题有关编程SAS:迁移那里。 – whuber

错误= 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

+1

应该详细了解ERRORS =选项...删除了我的答案并更新了您的答案 –

+1

有没有像ERRORABEND选项那样不会导致与SAS服务器断开连接?我使用连接到外部unix服务器的EG,虽然在第一个错误时停止处理会很好,但ERRORABEND会关闭到服务器的连接,这需要一段时间才能在下次运行时重新建立连接。 – orh

+1

您可能还会检查'&syserrortext'是否为非空。我发现这个变量比'&syserr'更可靠。 –

我经常做类似的东西RWill点结束,但我用宏包装我的整个程序。每个DATA步骤之后,PROC SQL,PROC SORT等我检查错误代码(& SYSERR或& SQLRC)。如果它不是零,我会跳到最后。

更多细节及代码在这里:https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/

我不能使用,因为我们组织的批处理系统如何运行在一个SAS会话独立的程序RWill的endsas。

+0

这太棒了!只需阅读博客条目并试用即可。多年来,我一直傻傻地认为SAS不能自动工作。 快速提问:在检查PROC SQL错误时,我是否必须使用SQLRC变量,还是仅当我关心恢复SQL错误代码时才使用SQLRC变量?它看起来像SYSERR与PROC SQL一起工作,但我想仔细检查。再次感谢! –

+1

@sparc_spread:如果您不在意处理PROC SQL中的错误,那么请不要检查错误代码。我认为这可能有用的一种情况是使用'drop table foo;'并且不关心表是否存在。 – Andrew

+0

太棒了,再次感谢。 –

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

在击中的错误(或者%sys_rc%sql_rc或使用参照业务逻辑)设置&g_cancel取消并&g_noexec为noexec。

这应该停止任何后续步骤运行 - 显然宏观变量可以为具有或检查执行纯粹宏步骤之前,无论运行(一收拾为例)步骤可以省略。

企业指南用户注意事项:唯一的警告提示是,如果您在同一个会话中运行多个代码项目,则需要在每个代码项目开始时重置错误条件,以免无关的错误停止任何工作。

+0

我想你的意思是'替换'运行“与第一句 –

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

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

要使用它,你基本上是在任何数据步骤结束键入%runquit;或PROC而不是键入你的正常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; 

它不是很漂亮时,通过读码,但它确实使调试了很多更轻松。

以补充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; 
+0

”run&cancel“'非常好!大概你还想在那里放一个'%abort'或'endsas;',这样程序的其余部分不会不必要地运行? –

+0

@AllanBowe这不需要在程序中经常使用'%checkErrors'吗?我只是在STP的最后放置了'%checkErrors',所以我不确定这会有什么用处。你怎么看? –

+0

正确,如果在程序结束时不需要中止。我只是考虑一些我自己的用例(长时间运行的STP),如果能够在程序中间放弃而不会将错误发送给客户端,那么这很方便。 –