Обработка ошибок на сокетах в SAS под OpenVMS - PullRequest
7 голосов
/ 27 апреля 2009

Я использую SAS 9.2 в OpenVMS для подключения к внешнему источнику данных через сокет, указанный в операторе имени файла:

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

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

Это работает (как и должно быть) в 99% случаев. Однако время от времени программа, которая должна прослушивать удаленный порт, не является. В настоящее время это приводит к выходу программы с ошибкой:

Error: Connection refused.

После чего мы пробуем снова, и это обычно работает. Тем не менее, это становится утомительным, поэтому я хотел бы обнаружить эту ошибку в программе и устранить ее там. Кто-нибудь знает способ обнаружения этого типа ошибки в SAS?

Я попытался проверить действительность fileref extsrc с помощью функции fileref (), но он просто возвращает -20005, что означает, что fileref назначен, но не указывает на локальный файл (что верно). Ошибка становится очевидной, только когда я использую fileref в шаге данных, поэтому я хотел бы сделать что-то вроде:

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] Я пытаюсь сделать предложения, приведенные ниже, но в истинном ключе проблема не возникла в течение последних нескольких дней, поэтому я не уверен, какое окончательное решение еще есть. [/ Update1]

[Update2] Ошибка, наконец, снова возникла. Согласно ответу cmjohns, значение syserr равно 1012 после возникновения этой ошибки. Теперь я посмотрю значение syserr и попробую снова фиксированное количество раз, если оно не получится. [/ Update2]

[Update3] У меня уже несколько дней работает код, который работает. Дополнительная проблема заключалась в том, что (разумеется), если &syserr получает значение больше 6, возникает условие ошибки, поэтому в зависимости от установки errorabend/noerrorabend это приводит к полному завершению программы или к ее продолжению obs=0 в режиме синтаксчек. Оба нежелательны. Решение состоит в том, чтобы установить options noerrorabend nosyntaxcheck до шага данных, который вызывает эту ошибку. Кроме того, если возникает ошибка, я должен очистить имя файла extsrc и переназначить его. Наконец, когда этот фрагмент кода завершен, я восстанавливаю errorabend. Если я восстановлю nosyntaxcheck, это заставит SAS обнаружить предыдущее состояние ошибки и переключиться в режим синтаксической проверки в этой точке, что также нежелательно. [/ Update3] * * тысяча двадцать-две

Ответы [ 3 ]

5 голосов
/ 28 апреля 2009

Вы пробовали проверить значение & syserr. Все, что не равно 0, обычно указывает на проблему.

Вы можете увидеть возвращаемые значения здесь . Судя по списку, я думаю, что 1012 или 1020 - это то, что вы получаете во время ошибки сокета.

3 голосов
/ 07 августа 2009

Я знаю, что это несвежая тема, но:

SYNTAXCHECK приятно иметь; вместо того, чтобы работать голым из-за проблемы & syserr (фактически & syscc), вы можете просто очистить его до последнего известного хорошего значения, как только вы пройдете этот чувствительный участок кода.

Вот соответствующие фрагменты кода, когда мне пришлось изящно обрабатывать ошибки заблокированных таблиц в 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 ;
3 голосов
/ 28 апреля 2009

Можете ли вы проверить данные foo? Если данных нет, вы можете установить цикл повторных попыток, если данные существуют, продолжить?

Что-то вроде:

doitagain:

(введите свой код сокета здесь)

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