Gérer les erreurs dans ses programmes SAS avec la macro SYSERR

SAS 6 févr. 2020

La macro variable SYSERR est une macro automatique dans SAS qui permet d'identifier si une étape DATA, une procédure a tourné avec ou sans erreur.

Cette macro prend une valeur graduelle en fonction du niveau de l'erreur rencontrée:

Valeur Description
0 Execution sans erreur ni avertissement
1 et 2 Execution annulée
4 Execution terminée sans Erreur mais avec Avertissement
5 et 6 Execution annulée
>6 Erreur, le code dépend du type d'erreur

Donc si la valeur de la macro variable est 0, l'éxecution s'est bien passée. Jusqu'à 6 il y a eu des avertissements ou alors elle a été annulée. Au dessus cette valeur, il y a eu soit des avertissement altérant le résultat du code (Avertissement group by, mémoire, d'écriture disque) ou des erreurs qui stoppent l'exécution (Erreur de Syntaxe, manque de mémoire, erreur générique).

Le détail des codes est disponible ici
DATA TEST; SET SASHELP.CLASS (obs=1); 
RUN; 
%PUT Code erreur &SYSERR; 
/* Code erreur 0 */

DATA TEST_; SET SASHELP.CLASS (blublublu=1); 
RUN; 
%PUT Code erreur &SYSERR; 
/* Code erreur 1012 */
/* Code générique d'erreur --> General error condition */

La valeur de la macro est est mise à jour après chaque RUN et QUIT. Cela permet donc d'identifier précisément où l'erreur se produit dans son programme.  

Utilisations possibles

Dans l'idée lorsque vous êtes en train de coder en SAS vous pouvez jeter un oeil sur votre LOG donc la macro variable syserr n'est pas d'une grande utilité. En revanche, si vous ordonnancez vos traitements et que vous épurez vos LOG ou que vous voulez conditionner l'éxecution de vos programmes en fonction des erreurs potentielles, cette macro peut vous simplifier la vie.

Ici un exemple avec une macro 'traitement' qui a besoin d'une table qui doit exister dans la WORK. Si il y a une erreur dans le début d'exécution on va la créer en appelant la macro 'init'.

%macro init; 
/* Création d'une table */
data table_initiale;
id = 1; 
coin = "BITCOIN"; 
run; 
%mend init; 


%macro traitement; 
/* Traitement qui a besoin de la table "table_initiale" pour fonctionner */
data table_top; set table_initiale (obs=1); 
run; 

/* On regarde la valeur de &syserr pour vérifier */
%put &syserr; 

/* Si il y a bien une erreur (en gros la table "table_initiale" n'existe pas */
%if &syserr > 6 %then %do; 
	%init; /* On lance la macro qui va créer la table initiale */
    
	/* --> On peut désormais l'utiliser */
	data table_top; set table_initiale (obs=1); 
	run; 
    
%end; 
%mend traitement; 

/* On lance la séquence de programme à partir de la macro "traitement" */
%traitement

C'est un exemple comme un autre... 🤷

Documentation et référence:

SYSERR Automatic Macro Variable: https://documentation.sas.com/?docsetId=mcrolref&docsetTarget=n1wrevo4roqsnxn1fbd9yezxvv9k.htm&docsetVersion=9.4&locale=en

LA GESTION DES ERREURS DANS SAS, "A la une du Support": https://www.sas.com/content/dam/SAS/fr_fr/doc/support-clients/articles/us2016_q3_la-gestion-des-erreurs-dans-sas.pdf

Super ! Vous vous êtes inscrit avec succès.
Super ! Effectuez le paiement pour obtenir l'accès complet.
Bon retour parmi nous ! Vous vous êtes connecté avec succès.
Parfait ! Votre compte est entièrement activé, vous avez désormais accès à tout le contenu.