2009-04-27 27 views
7
我使用的是SAS 9.2 OpenVMS上

下處理在SAS插座連接到外部數據源上有一個文件名陳述specifed插座:錯誤的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()函數檢查fileref extsrc的有效性,但是這只是返回-20005,這意味着fileref被賦值但不指向本地文件(這是真的)。該錯誤只當我使用fileref在datastep變得明顯,所以我想一起做東西線:

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設置,這會導致程序完全結束,或者導致程序以syntaxchek模式繼續使用obs=0。兩者都是不可取的。解決方法是在產生此錯誤的datastep之前設置options noerrorabend nosyntaxcheck。此外,如果發生錯誤,我必須清除文件名extsrc並重新分配它。最後,一旦這段代碼完成,我會恢復錯誤。如果我恢復nosyntaxcheck,這會導致SAS檢測到以前的錯誤情況,並在該點切換到語法檢查模式,這也是不理想的。 [/ update3]

+0

你有沒有問過這個在SAS新聞組http://groups.google.com/group /comp.soft-sys.sas/topics – 2009-04-27 12:28:58

回答

5

您是否嘗試過測試& syserr的值。任何不是0的情況通常表明存在問題。

您可以看到返回值爲here。從列表來看,我猜測1012或1020是你在socket錯誤期間得到的。

+0

我目前正在研究這個問題,看看它是否解決了我的問題 – 2009-05-05 09:42:46

+1

您也可以在將ERRORCHECK設置爲STRICT後檢查&syscc的值,參見http://support.sas.com/文檔/ cdl/en/mcrolref/61885/HTML /默認/ tw3514-syscc-var.htm – cmjohns 2009-05-05 15:31:28

3

你可以測試數據foo嗎?如果沒有數據,那麼你可以設置一個重試循環,如果數據存在,繼續?

喜歡的東西:

doitagain:

(insert your socket code here)

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

我知道這是一個陳舊的線程,但:

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 ;