我有一个SAS-Storedprocess,通过webout执行一些html输出。 在某些情况下(例如:没有数据可用)我想放置一个自定义错误消息并停止进一步执行。
我有一个makro解决方案到目前为止工作正常:
%if &varnobs = 0 %then %do;
data _null_;
file _webout;
put " &text1";
put " &text2";
put " &text3";
run;
ENDSAS;
%end;
但现在我被告知在我们公司内部不允许使用ENDSAS,因为它可能会产生各种副作用,并且不仅可以阻止该过程,还可以阻止整个会话。
现在我正在寻找替代方案,我也尝试了几个选项的中止语句,但是有一个问题,中止在日志中放入一条错误消息,这样就不会显示我的自定义消息,而是一个sas错误信息。同样在中止文档中指出(abort),中止不仅会停止进程,还会阻止会话。
我知道有一些编程方式,比如if-else或goto而不是停止进程,但这不是我特定问题的选项。
所以问题是:
如何在执行期间停止存储过程,而不停止会话,没有其他副作用且没有SAS错误消息?
答案 0 :(得分:0)
您是否尝试过设置NOERRORABEND
?可能是一个可能的选择。
答案 1 :(得分:0)
这是一个有趣,棘手的领域。在某些设置中,设置系统选项:
options obs=0 noreplace;
可以作为代理。
答案 2 :(得分:0)
以下是在不引发前端错误的情况下中止stp会话的唯一方法:
data _null_;
rc = stpsrvset('program error', 0);
run;
endsas;
您必须使用endsas
。如果这会导致问题,请尝试将max clients
设置为1(或调整每个客户端的成本,以便每个服务器/多桥连接只有一个客户端)。这样,停止父进程/会话就不会有问题(如果确实发生了这种情况)。
或者,您需要设计错误处理,以便在所有父宏中安静地启用%return
。
这是我使用的宏:https://github.com/Boemska/macrocore/blob/master/base/mf_abort.sas
答案 3 :(得分:0)
你可以做if else方法来防止额外的代码运行并打印自定义消息错误
%if &data ne "" %then;
*your code;
%else
data _null_;
file _webout;
put 'html code of custom message';
run;
答案 4 :(得分:0)
SAS在处理错误方面非常糟糕,所以我的建议是尽可能避免错误; - )
除了笑话,是的,endsas
和%abort cancel
之外的选项有限;
您可以尝试在检查后将所有代码移动到有条件执行的%include
语句中。类似的东西:
%macro conditional_execute;
%if &some_condition %then %do;
%include "rest_of_logic_to_perform.sas";
%end;
%else %do;
%put ERROR: CUSTOM ERROR MESSAGE HERE;
%end;
%mend;
包含而不是将所有代码放在宏中的原因是我假设还有大量的处理要执行。如果是少量代码,则可以将其置于%if
条件下。