kl78
kl78

Reputation: 1666

Ending a SAS-Stored process properly

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?

Upvotes: 2

Views: 1138

Answers (5)

Allan Bowe
Allan Bowe

Reputation: 12691

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

Upvotes: 1

Robert Penridge
Robert Penridge

Reputation: 8513

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.

Upvotes: 0

Azeem112
Azeem112

Reputation: 377

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;

Upvotes: 0

Quentin
Quentin

Reputation: 6378

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

options obs=0 noreplace;

might work as proxy.

Upvotes: 0

siegerts
siegerts

Reputation: 471

Have you tried turning setting NOERRORABEND? Might be a possible option.

Upvotes: 0

Related Questions