문제

OpenVMS에서 SAS 9.2를 사용하여 Filename 문으로 지정된 소켓을 통해 외부 데이터 소스에 연결합니다.

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

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

시간의 99%가 작동합니다. 그러나 가끔 원격 포트에서 듣고있는 프로그램은 그렇지 않습니다. 현재이 프로그램은 오류가 발생하여 종료됩니다.

Error: Connection refused.

그 후 우리는 다시 시도하고 일반적으로 작동합니다. 그러나 이것은 지루해지고 있으므로 프로그램 에서이 오류를 감지하고 거기에서 처리하고 싶습니다. SAS에서 이러한 유형의 오류를 감지하는 방법을 아는 사람이 있습니까?

Fileref () 함수를 사용하여 Fileref ExtSRC의 유효성을 확인하려고 시도했지만 -20005를 반환합니다. 즉, Fileref가 할당되었지만 로컬 파일을 가리키지 않음을 의미합니다 (True). 데이터 스텝에서 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] 아래에 수행 한 제안을 시도하고 있지만 사실입니다. Heisenbug 패션 지난 며칠 동안 문제가 발생하지 않았으므로 최종 솔루션이 아직 무엇인지 잘 모르겠습니다. [/update1

Update2] 오류가 마침내 다시 자랐습니다. cmjohns 답변에 따라,이 오류가 발생한 후 Syserr의 값은 1012입니다. 이제 Syserr의 가치를보고 실패하면 다시 고정 된 횟수를 다시 시도하겠습니다. [/update2

Update3] 저는 며칠 동안 작동하는 코드를 며칠 동안 진행했습니다. 추가적인 문제는 (물론) &syserr 6보다 높은 값을 얻습니다. 오류 조건이 발생하므로 errorabend/noerrorabend 이를 설정하면 프로그램이 완전히 종료되거나 프로그램이 계속됩니다. obs=0 syntaxchek 모드에서. 둘 다 바람직하지 않습니다. 해결책은 설정하는 것입니다 options noerrorabend nosyntaxcheck 이 오류를 생성하는 데이터 스텝 전에. 또한 오류가 발생하면 Filename ExtSRC를 지우고 재 할당해야합니다. 마지막으로,이 코드가 완료되면 ErrorAbend를 복원합니다. nosyntaxCheck을 복원하면 SAS가 이전 오류 조건을 감지하고 해당 시점에서 SyntaxCheck 모드로 전환하여 바람직하지 않습니다. [/업데이트 3

도움이 되었습니까?

해결책

& syserr의 가치 테스트를 시도해 보셨습니까? 0이 아닌 것은 일반적으로 문제를 나타냅니다.

반환 값을 볼 수 있습니다 여기. 목록으로 판단하면 1012 또는 1020이 소켓 오류 중에 얻는 것 같아요.

다른 팁

데이터 foo를 테스트 할 수 있습니까? 데이터가 없으면 레트리 루프를 설정할 수 있습니다. 데이터가 있으면 계속할 수 있습니까?

같은 것 :

다시 할:

(여기에 소켓 코드 삽입)

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

나는 이것이 오래된 스레드라는 것을 알고 있지만 :

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 ;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top