Question

J'utilise SAS 9.2 sur OpenVMS pour se connecter à une source de données externe sur une prise avec une instruction spécifiées de nom:

filename extsrc SOCKET "extserver:port" recfm=v;

data foo;
infile extsrc;
input;
.... some statements to read stuff ...;
run;

Cela fonctionne (comme il se doit) 99% du temps. Cependant, une fois dans un certain temps le programme qui est censé être à l'écoute sur le port distant n'est pas. À l'heure actuelle ce fait que le programme pour sortir avec une erreur:

Error: Connection refused.

Après quoi nous essayons à nouveau, et il travaille habituellement. Toutefois, cela est de plus en plus pénible, donc je voudrais détecter cette erreur dans le programme et les traiter là-bas. Quelqu'un sait-il un moyen de détecter ce type d'erreur dans SAS?

J'ai essayé de vérifier la validité du extsrc fileref en utilisant la fonction fileref (), mais renvoie simplement -20005, ce qui signifie que le fileref est attribué, mais ne pointe pas vers un fichier local (ce qui est vrai). L'erreur apparaît lorsque j'utilise seulement le fileref dans un datastep, donc je voudrais faire quelque chose le long des lignes de:

data _null_;
rc=infile extsrc;
if rc=0 then do;
  //whatever I want to do;
end;
else do;
  //throw some error and try again later;
end;
run;

[Update1] J'essaie les suggestions faites ci-dessous, mais dans le vrai Heisenbug mode le problème n'a pas surgiront au cours des derniers jours, donc je ne suis pas sûr de ce que la solution finale est encore. [/ Update1]

[MAJ2] L'erreur a finalement resurgi. Selon cmjohns réponse, la valeur de syserr est 1012 après cette erreur se produit. Je vais maintenant regarder la valeur de syserr, et essayez à nouveau un nombre de fois si elle échoue. [/ Update2]

[Update3] J'ai eu un peu de code jusqu'à une course pour quelques jours maintenant que les travaux. Le problème supplémentaire est que (bien sûr) si &syserr obtient une valeur supérieure à 6 une condition d'erreur est survenue, si en fonction de votre errorabend/noerrorabend mise en pidof de mettre fin complètement, ou provoque le programme de poursuivre obs=0 en mode syntaxchek. Les deux sont indésirables. La solution est de mettre options noerrorabend nosyntaxcheck avant la datastep qui produit cette erreur. De plus, si l'erreur se produit, je dois effacer le nom de fichier extsrc et réattribuer. Enfin, une fois que ce morceau de code est complet je ramènerai errorabend. Si je ramènerai nosyntaxcheck cela provoque SAS pour détecter la condition d'erreur précédente et passer en mode syntaxcheck à ce moment-là, qui est également indésirable. [/ Update3]

Était-ce utile?

La solution

Avez-vous essayé de tester la valeur et syserr. Tout ce qui ne 0 indique généralement un problème.

Vous pouvez voir les valeurs de retour ici . A en juger par la liste Je suppose un 1012 ou 1020 est ce que vous obtenez au cours de l'erreur de socket.

Autres conseils

Pouvez-vous tester pour les données foo? S'il n'y a pas de données, vous pouvez définir une boucle de nouvelle tentative, s'il existe des données, continuer?

Quelque chose comme:

  

doitagain:

     

(insérez le code socket ici)

/*see if ds exists*/

%if not %sysfunc(exist(data.foo)) %then %do ;

/*if the ds does not exist then*/

%put WARNING: The file does not exist! ;

%goto doitagain;

%end;

Je sais que c'est un fil rassis, mais:

SYNTAXCHECK est agréable d'avoir; au lieu de courir nu à cause de la & syserr (en fait, et syscc) problème, vous pouvez simplement l'effacer au dernier-bien-connu valeur une fois que vous êtes passé section sensible du code.

Voici les bits correspondants de code pour quand je devais gérer correctement les erreurs de table verrouillée de DB2:

/*** temporarily disable ERRORABEND and SYNTAXCHECK ***/
options NOERRORABEND NOSYNTAXCHECK ;

/* save &syscc for laster restoration */
%let presyscc=&syscc;

%do until (...);
  /* do a task, handle some possible errors */
%end;

/* restore &syscc */
%let syscc=&presyscc;

/*** re-enable ERRORABEND and SYNTAXCHECK ***/
options ERRORABEND SYNTAXCHECK ;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top