2009-04-27 12 views
7

मैं एसएएस 9.2 उपयोग कर रहा हूँ ओपन VMS पर के तहत एसएएस में सॉकेट पर निपटने त्रुटि:ओपन VMS

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

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

यह काम करता है (जैसा कि होना चाहिए) 99 % समय की। हालांकि, थोड़ी देर में रिमोट पोर्ट पर जो प्रोग्राम सुनना है, वह नहीं है। वर्तमान में इस कार्यक्रम के एक त्रुटि के साथ बाहर निकलने के लिए कारण बनता है:

Error: Connection refused. 

जो बाद हम फिर कोशिश करें, और यह आमतौर पर काम करता है। हालांकि, यह कठिन हो रहा है इसलिए मैं इस त्रुटि को प्रोग्राम में पहचानना चाहता हूं और वहां से निपटना चाहता हूं। क्या किसी को एसएएस में इस प्रकार की त्रुटि का पता लगाने के तरीके के बारे में पता है?

मैंने fileref() फ़ंक्शन का उपयोग करके fileref extsrc की वैधता की जांच करने का प्रयास किया है, लेकिन यह केवल -20005 देता है, जिसका अर्थ है कि fileref असाइन किया गया है लेकिन स्थानीय फ़ाइल (जो सत्य है) को इंगित नहीं करता है। त्रुटि केवल स्पष्ट हो जाता है जब मैं एक datastep में 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 फैशन पिछले कुछ दिनों में समस्या का सामना करने में विफल रहा है, इसलिए मुझे यकीन नहीं है कि अंतिम समाधान अभी तक क्या है। [/ अपडेट 1]

[अपडेट 2] अंत में त्रुटि फिर से उठी। Cmjohns उत्तर के अनुसार, इस त्रुटि के बाद syserr का मान 1012 है। अब मैं syserr का मान देखूंगा, और विफल होने पर निश्चित समय की कोशिश करूँगा। [/ अपडेट 2]

[अपडेट 3] मेरे पास कुछ दिनों के लिए कुछ कोड चल रहा है जो काम करता है। अतिरिक्त समस्या यह थी कि (बेशक) यदि &syserr 6 से अधिक मान प्राप्त करता है तो एक त्रुटि स्थिति उत्पन्न होती है, इसलिए आपके errorabend/noerrorabend सेटिंग के आधार पर प्रोग्राम पूरी तरह खत्म हो जाता है, या यह प्रोग्राम को सिंटैक्सकेक मोड में obs=0 के साथ जारी रखने का कारण बनता है। दोनों अवांछनीय हैं। समाधान इस त्रुटि को उत्पन्न करने वाले डेटास्टेप से पहले options noerrorabend nosyntaxcheck सेट करना है। इसके अतिरिक्त, अगर त्रुटि होती है तो मुझे फ़ाइल नाम extsrc को साफ़ करना होगा और इसे फिर से असाइन करना होगा। अंत में, कोड के इस टुकड़े को पूरा करने के बाद मैं त्रुटिबोध बहाल करता हूं। अगर मैं nosyntaxcheck को पुनर्स्थापित करता हूं तो यह एसएएस को पिछली त्रुटि स्थिति का पता लगाने और उस बिंदु पर वाक्यविन्यास मोड पर स्विच करने का कारण बनता है जो अवांछनीय भी है। [/ अपडेट 3]

+0

आप एसएएस समाचार समूह में इस पूछा है http://groups.google.com/group:

यहाँ के लिए जब मैं शान से डीबी 2 से बंद-टेबल त्रुटियों को संभालने के लिए किया था कोड के प्रासंगिक बिट कर रहे हैं /comp.soft-sys.sas/topics –

उत्तर

5

क्या आपने & syserr के मान का परीक्षण करने का प्रयास किया है। 0 नहीं जो कुछ भी आम तौर पर एक समस्या इंगित करता है।

आप वापसी मान here देख सकते हैं। सूची के आधार पर मुझे लगता है कि सॉकेट त्रुटि के दौरान आपको 1012 या 1020 का अनुभव हो रहा है।

+0

मैं वर्तमान में यह देखने के लिए देख रहा हूं कि यह मेरी समस्या –

+1

को ठीक करता है या नहीं, आप STRICT को ERRORCHECK सेट करने के बाद & syscc का मान भी देख सकते हैं http://support.sas.com/ प्रलेखन/सीडीएल/एन/mcrolref/61885/एचटीएमएल/डिफ़ॉल्ट/tw3514-syscc-var.htm – cmjohns

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; 
+0

हां वास्तव में मेरी योजना है, लेकिन पहले मुझे विश्वसनीय रूप से यह पता लगाने के लिए कुछ तरीका चाहिए कि डेटासेट foo मौजूद नहीं है कारण यह सॉकेट समस्या है । अगर कुछ और गलत है तो भी मैं भरोसेमंद रूप से गलती करना चाहता हूं। –

+0

क्या आप डेटा के अस्तित्व के लिए परीक्षण का संयोजन कर सकते हैं और डेटा नहीं होने पर त्रुटि को पार्स कर सकते हैं। इसलिए, यदि डेटा वहां नहीं है और त्रुटि वह नहीं है जो आप उम्मीद करते हैं, मर जाते हैं ..? बीटीडब्ल्यू, लूप पर पुनरावृत्तियों की संख्या को सीमित करना न भूलें। ऊपर मेरा उदाहरण ऐसा नहीं किया। – AFHood

3

मैं जानता हूँ कि यह एक बासी धागा है, लेकिन:

SYNTAXCHECK अच्छा है; & syserr (वास्तव में & syscc) समस्या के कारण नग्न चलने की बजाए, कोड के उस संवेदनशील अनुभाग से पहले आप इसे अंतिम-ज्ञात-अच्छे मान के लिए साफ़ कर सकते हैं।

/*** 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 ; 
संबंधित मुद्दे