SAS喜欢在警告和错误之后继续处理,所以我经常需要滚动回日志页面以查找问题。有更好的方法吗?我希望它能在第一次出现错误或警告时停止处理,这样我就可以修复问题并重试。
SAS 常常在出现警告和错误后依然继续处理,因此我常常需要浏览整个日志页面来查找问题。 有没有更好的方式?我希望它可以在第一个错误或警告出现时立即停下来,这样我就能够及时修正并尝试再次运行。SAS喜欢在警告和错误之后继续处理,所以我经常需要滚动回日志页面以查找问题。有更好的方法吗?我希望它能在第一次出现错误或警告时停止处理,这样我就可以修复问题并重试。
SAS 常常在出现警告和错误后依然继续处理,因此我常常需要浏览整个日志页面来查找问题。 有没有更好的方式?我希望它可以在第一个错误或警告出现时立即停下来,这样我就能够及时修正并尝试再次运行。之前建议使用的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时终止。
&syserrortext
是否非空。我发现这个变量比&syserr
更可靠。 - Jake Z%runquit
宏。对于批处理和交互式会话都很有效(不关闭会话,只停止运行代码)。%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;
虽然阅读代码时不太美观,但这确实使得调试变得更加容易。
run
替换为run &g_cancel
,proc sql;
替换为proc sql &g_noexec;
。最初,&g_cancel
和&g_noexec
的值都为空,因此会执行所有步骤。%sys_rc
、%sql_rc
还是业务逻辑)时,设置&g_cancel
为cancel,&g_noexec
为noexec。作为对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;
%abort
或endsas;
,这样程序的其余部分就不会不必要地运行了吧? - Allan Bowe%checkErrors
吗?我只是将%checkErrors
放置在STP的最后,所以我不确定它是否还有用于中止。你怎么看? - stallingOnesyscc=0
部分非常必要! - Allan Bowe