Pergunta

Eu estou usando SAS 9.2 em OpenVMS se conectar a uma fonte de dados externa através de um socket specifed com uma declaração filename:

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

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

Isso funciona (como deveria) 99% do tempo. No entanto, de vez em quando o programa que é suposto estar a ouvir na porta remota não é. Atualmente esta faz com que o programa para sair com um erro:

Error: Connection refused.

Depois que tentar de novo, e ele funciona normalmente. No entanto, isso está se tornando tedioso assim que eu gostaria de detectar esse erro no programa e lidar com ele lá. Alguém sabe de uma maneira de detectar esse tipo de erro no SAS?

Eu tentei verificar a validade do extsrc fileref usando a função fileref (), mas isso só retorna -20005, o que significa que o fileref é atribuído, mas não aponta para um arquivo local (o que é verdade). O erro só se torna aparente quando eu uso o fileref em um datastep, então eu gostaria de fazer algo ao longo das linhas 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;

[atualização1] Eu estou tentando as sugestões feitas a seguir, mas na verdade heisenbug forma o problema falhou a surgir ao longo dos últimos dias, então eu não sei o que a solução final é ainda. [/ Atualização1]

[Update2] O erro, finalmente, surgiram novamente. Como por resposta cmjohns, o valor de SYSERR é 1012 após este erro ocorre. Agora eu vou assistir o valor de SYSERR, e tente novamente um número fixo de vezes se ele falhar. [/ Update2]

[Update3] Eu tive algum código-se uma corrida por alguns dias agora que obras. O problema adicional foi que (é claro) se &syserr obtém um valor superior a 6 uma condição de erro ocorreu, assim, dependendo de sua configuração isso faz com que o programa para terminar completamente, ou faz com que o programa continue com errorabend/noerrorabend no modo syntaxchek obs=0. Ambos são indesejáveis. A solução é definir options noerrorabend nosyntaxcheck antes do datastep que produz este erro. Além disso, se ocorrer o erro que eu tenho que limpar filename extsrc e atribuí-lo novamente. Finalmente, uma vez que este pedaço de código está completo restauro errorabend. Se eu restaurar nosyntaxcheck isso faz com que SAS para detectar a condição de erro anterior e mude para o modo syntaxcheck nesse ponto que também é indesejável. [/ Update3]

Foi útil?

Solução

Você tentou testar o valor de & SYSERR. Qualquer coisa que não 0 geralmente indica um problema.

Você pode ver valores de retorno aqui . A julgar pela lista Eu acho que um 1012 ou 1020 é o que você está recebendo durante o erro de soquete.

Outras dicas

Você pode testar para o foo de dados? Se não houver dados, então você pode definir um loop de repetição, se existirem dados, continuar?

Algo como:

doitagain:

(inserir o seu código de soquete aqui)

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

Eu sei que este é um segmento obsoleto, mas:

SYNTAXCHECK é bom ter; em vez de correr nua por causa do & SYSERR (na verdade & syscc) problema, você pode simplesmente limpá-la para a última conhecido-bom valor Quando estiver passado essa seção sensível de código.

Aqui estão as partes relevantes do código para quando eu tive que lidar com graciosamente erros de tabela bloqueada a partir do 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 ;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top