2
votes

I have a SAS-Storedprocess which does some html-output via webout. Under some circumstances (e.G.: no data available) i want to put a custom error message and stop the process from further execution.

I have a makro-solution which had worked fine so far:

%if &varnobs = 0 %then %do;
 data _null_;
    file _webout;   
    put " &text1";
    put " &text2";
    put " &text3";
 run;
ENDSAS; 
%end;

But now i was informed that the use of ENDSAS is not allowed within our company because it can have various side-effects and also can stop not only the process, but also the complete session.

Now i am looking for alternatives, i had also tried the abort statement with several options, but one problem there was, that abort puts an error message in the log, so that not my custom message is shown, but a sas error message. Also in the abort documentation is stated (abort), that abort not only stops the process, but also the session.

I know there are programatically alternatives like if-else or goto instead of stopping the process, but that is not an option for my specific problem.

So the question is:

How to stop a stored process during execution, without stopping the session, without other side effects and without an SAS error-message?

5

5 Answers

0
votes

This is an interesting, tricky area. In some settings, setting system options:

options obs=0 noreplace;

might work as proxy.

0
votes

you can do if else approach to prevent extra code from running and print a custom message error as

%if &data ne "" %then;
   *your code;

%else
  data _null_;
   file _webout;
    put 'html code of custom message';
  run;
0
votes

SAS is horrible at error handling so my suggestion is to avoid errors whenever possible ;-)

Jokes aside, yeah, there's limited options aside from endsas and %abort cancel;

You could try moving all code after the check into an %include statement that gets conditionally executed. Something like:

%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;  

The reason for an include rather than putting all the code inside of the macro is that I'm assuming there's a substantial amount of processing still to be performed. If it is a short amount of code then yes you could just put it within the %if condition.

0
votes

Indeed, endsas; can cause unrecoverable issues in some SAS environments, particularly 9.4m3

For that reason in the SASjs Core library we had to resort to an 'out of the box' method for preventing further execution

We call it "skippy" - simply open a macro (or two) and don't close them!

filename skip temp;
data _null_;
  file skip;
  put '%macro skip(); %macro skippy();';
run;
%inc skip;

This is the full macro we use in SASjs: https://github.com/sasjs/core/blob/main/base/mp_abort.sas