有没有办法在发生第一次警告或错误时停止SAS?
SAS喜欢继续警告和错误后处理好,所以我经常需要回到通过日志的页面滚动查找的问题。有没有更好的办法?我希望在出现第一个错误或警告时立即停止,以便我可以修复它并重试。有没有办法在发生第一次警告或错误时停止SAS?
错误= 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
应该详细了解ERRORS =选项...删除了我的答案并更新了您的答案 –
有没有像ERRORABEND选项那样不会导致与SAS服务器断开连接?我使用连接到外部unix服务器的EG,虽然在第一个错误时停止处理会很好,但ERRORABEND会关闭到服务器的连接,这需要一段时间才能在下次运行时重新建立连接。 – orh
您可能还会检查'&syserrortext'是否为非空。我发现这个变量比'&syserr'更可靠。 –
我经常做类似的东西RWill点结束,但我用宏包装我的整个程序。每个DATA步骤之后,PROC SQL,PROC SORT等我检查错误代码(& SYSERR或& SQLRC)。如果它不是零,我会跳到最后。
更多细节及代码在这里:https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/
我不能使用,因为我们组织的批处理系统如何运行在一个SAS会话独立的程序RWill的endsas。
这太棒了!只需阅读博客条目并试用即可。多年来,我一直傻傻地认为SAS不能自动工作。 快速提问:在检查PROC SQL错误时,我是否必须使用SQLRC变量,还是仅当我关心恢复SQL错误代码时才使用SQLRC变量?它看起来像SYSERR与PROC SQL一起工作,但我想仔细检查。再次感谢! –
@sparc_spread:如果您不在意处理PROC SQL中的错误,那么请不要检查错误代码。我认为这可能有用的一种情况是使用'drop table foo;'并且不关心表是否存在。 – Andrew
太棒了,再次感谢。 –
一种选择是将run
全部替换为run &g_cancel
,将proc sql;
替换为proc sql &g_noexec;
。最初&g_cancel
和&g_noexec
被设置为无,所以一切运行。
在击中的错误(或者%sys_rc
,%sql_rc
或使用参照业务逻辑)设置&g_cancel
取消并&g_noexec
为noexec。
这应该停止任何后续步骤运行 - 显然宏观变量可以为具有或检查执行纯粹宏步骤之前,无论运行(一收拾为例)步骤可以省略。
企业指南用户注意事项:唯一的警告提示是,如果您在同一个会话中运行多个代码项目,则需要在每个代码项目开始时重置错误条件,以免无关的错误停止任何工作。
我想你的意思是'替换'运行“与第一句 –
我一直在使用最近%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;
它不是很漂亮时,通过读码,但它确实使调试了很多更轻松。
以补充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;
”run&cancel“'非常好!大概你还想在那里放一个'%abort'或'endsas;',这样程序的其余部分不会不必要地运行? –
@AllanBowe这不需要在程序中经常使用'%checkErrors'吗?我只是在STP的最后放置了'%checkErrors',所以我不确定这会有什么用处。你怎么看? –
正确,如果在程序结束时不需要中止。我只是考虑一些我自己的用例(长时间运行的STP),如果能够在程序中间放弃而不会将错误发送给客户端,那么这很方便。 –
我看到SO域问题有关编程SAS:迁移那里。 – whuber