Tratamento de erros em soquetes na SAS sob OpenVMS
-
16-09-2019 - |
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]
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 ;