Frage

Ich bin mit SAS 9.2 auf OpenVMS zu einer externen Datenquelle über eine Steckdose mit einem Dateinamen Anweisung specifed verbinden:

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

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

Das funktioniert (wie es sein soll) 99% der Zeit. Doch hin und wieder das Programm, das auf dem Remote-Port sollte zu hören ist es nicht. Zur Zeit führt dies das Programm mit einem Fehler zu beenden:

Error: Connection refused.

Nach dem versuchen wir wieder, und es funktioniert in der Regel. Dies ist jedoch immer langweilig so dass ich diesen Fehler in dem Programm erkennen möchte und es damit umgehen. Kennt jemand eine Möglichkeit, diese Art von Fehlern in SAS zu erkennen?

Ich habe versucht, die Gültigkeit der fileref extsrc Überprüfung der fileref () Funktion, aber das gibt nur -20005, was bedeutet, dass die fileref zugeordnet ist, sondern verweist nicht auf eine lokale Datei (was stimmt). Der Fehler wird erst deutlich, wenn ich die fileref in einem datastep verwenden, so würde Ich mag etwas entlang der Linien von dem tun:

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] Ich versuche, die folgenden Vorschläge gemacht, aber im wahren Heisenbug Art und Weise das Problem gescheitert aufzutauchen hat in den letzten Tagen einig, so bin ich nicht sicher, was die endgültige Lösung noch ist. [/ Update1]

[update2] Der Fehler abgeschnitten schließlich wieder auf. Wie pro cmjohns Antwort, ist der Wert von syserr 1012 nach diesem Fehler auftritt. Ich werde jetzt den Wert von syserr beobachten, und versuchen Sie es erneut eine feste Anzahl von Zeiten, wenn es fehlschlägt. [/ Update2]

[Update3] Ich habe eine Lauf einige Code up für ein paar Tage jetzt das funktioniert. Das zusätzliche Problem war, dass (natürlich), wenn &syserr Wert wird höher als 6 ein Fehler aufgetreten ist, so auf Ihrem errorabend/noerrorabend je dieser Einstellung bewirkt, dass das Programm vollständig zu beenden, oder es wird das Programm mit obs=0 in syntaxchek Modus fortzusetzen. Beide sind unerwünscht. Die Lösung ist options noerrorabend nosyntaxcheck vor dem datastep zu setzen, die diesen Fehler erzeugt. Außerdem, wenn der Fehler auftritt, habe ich Dateinamen extsrc zu löschen und es neu zuweisen. Schließlich, wenn dieses Stück Code vollständig wiederherstellen I errorabend. Wenn ich wieder herstellen nosyntaxcheck verursacht dies SAS den vorherigen Fehlerzustand zu erkennen und zu wechseln Modus an diesem Punkt syntaxcheck was ebenfalls unerwünscht ist. [/ Update3]

War es hilfreich?

Lösung

Haben Sie versucht, den Wert von & syserr testen. Alles, was nicht 0 bedeutet im Allgemeinen ein Problem.

Sie können Rückgabewerte finden Sie unter hier . von der Liste zu urteilen würde ich ein 1012 oder 1020 erraten, was Sie während der Socket-Fehler erhalten.

Andere Tipps

Können Sie für die Daten foo testen? Wenn keine Daten vorhanden sind, dann können Sie eine Wiederholungsschleife gesetzt, wenn Daten vorhanden sind, weitergehen?

So etwas wie:

  

doitagain:

     

(fügen Sie Ihren Socket-Code hier)

/*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;

Ich weiß, dass dies ein schaler Faden, aber:

SYNTAXCHECK ist schön zu haben; statt nackt läuft wegen der & syserr (eigentlich & syscc) Ausgabe, können Sie einfach klar, dass es zum letzten bekannt-guten Wert, sobald Sie hinter diesem sensiblen Abschnitt des Codes sind.

Hier sind die entsprechenden Bits von Code, wenn ich hatte graziös Fehler Locked-Tabelle von DB2 zu behandeln:

/*** 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 ;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top