SAS喜欢在发出警告和错误后继续处理,因此我经常需要向后滚动日志中的页面以查找问题。有没有更好的办法?我希望它在第一个错误或警告出现后立即停止,以便我可以修复它并再试一次。
答案 0 :(得分:15)
之前建议使用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以外的任何地方终止。
答案 1 :(得分:4)
我最近一直在使用%runquit
宏。适用于批处理作业和交互式会话(不会关闭会话,只是停止运行代码)。
来源:http://www.cpc.unc.edu/research/tools/data_analysis/sas_to_stata/sas-macros/runquit.html
要使用它,您基本上在任何数据步骤或PROC的末尾键入%runquit;
,而不是键入常规的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;
在阅读代码时,它并不那么漂亮,但它确实使调试变得更加容易。
答案 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;