2011-05-11 14 views
6

मैं फ़ाइल की सामग्री पर eval कर रहा हूं। फ़ाइल लेबल से बना है जिसे मैं पार्स करता हूं। प्रत्येक पंक्ति में एक लेबल होता है, और मेरे पास प्रत्येक लेबल के लिए proc परिभाषित किया गया है, ताकि eval सफल हो। हालांकि, कभी-कभी उपयोगकर्ता नए लेबल जोड़ते हैं और फिर अज्ञात कमांड के कारण eval कमांड विफल हो जाता है।अज्ञात कमांड पर क्रैशिंग से टीसीएल को रोकें

क्या कोई अज्ञात कमांड eval पर प्रयास करते समय Tcl को क्रैश होने से रोकने का कोई तरीका है?
आदर्श रूप में, मुझे मुझे अपने स्वयं के परिभाषित व्यवहार के साथ प्रतिस्थापित करने की अनुमति देनी चाहिए - जैसे कि त्रुटि का प्रावधान करना और eval के साथ जारी रखना।


संपादित:

दुर्भाग्य से, मैं केवल Tcl 8.4 उपयोग कर सकते हैं।

proc handle_unknown_label {cmd args} { ... } 

और उसके बाद:
मैं निम्नलिखित, as suggested here कर की कोशिश की

rename unknown _old_system_unknown 
rename handle_unknown_label unknown 

catch {set ret [eval $x]} err 

rename unknown handle_unknown_label 
rename _old_system_unknown unknown 

लेकिन मैं अभी भी eval के लिए समान व्यवहार प्राप्त है, और यह निम्न त्रुटियों प्रिंट:

प्रक्रिया अज्ञात एक संरक्षित प्रो है और इसका नाम बदलकर
प्रक्रिया अज्ञात एक समर्थक है tected proc और ओवरराइड नहीं किया जाएगा
प्रक्रिया अज्ञात एक संरक्षित proc है और नाम दिया नहीं किया जाएगा
प्रक्रिया अज्ञात एक संरक्षित proc है और ओवरराइड नहीं हो जाएगी

+1

लागू नहीं है लेकिन यदि आप एक फ़ाइल पढ़ रहे हैं और इसे विकसित कर रहे हैं तो आप इसके बजाय फ़ाइल को स्रोत भी कर सकते हैं, नहीं? –

+1

यह टीसीएल दुभाषिया क्या पर्यावरण है? मैं उस "संरक्षित proc" त्रुटि से परिचित नहीं हूं। –

+0

@glenn दिलचस्प। तो यह कुछ ऐसा हो सकता है जो मेरी फर्म में अक्षम हो? –

उत्तर

2

लागू अपने खुद के आदेश unknown कहा जाता है, जो के रूप में लेता है इसकी तर्क सभी शब्दों है कि आदेश नहीं पाया जा सकता है बनाते हैं और इसके आर्ग:

proc unknown {cmdName args} { 
    puts "UNKNOWN COMMAND: $cmdName" 
    puts "CALLED WITH ARGUMENTS: $args" 
} 

तुम सब करना ही आप namespace unknown के उपयोग के साथ अधिक सजावटी प्राप्त कर सकते हैं की जरूरत के बारे में है यही कारण है कि।

+0

धन्यवाद! क्या आप 'नेमस्पेस अज्ञात' कमांड का उपयोग करने का उदाहरण दे सकते हैं? मैं अस्थायी रूप से अज्ञात आदेशों के हैंडलिंग को बदलना चाहता हूं, इसलिए मैं जानना चाहता हूं कि डिफ़ॉल्ट हैंडलिंग को कैसे बदला जाए और फिर पुनर्स्थापित करें। –

+0

कृपया मेरा संपादन –

+0

@ एमीर देखें: किसी ने आपको भारी लॉक कर दिया है, इसलिए हम इतना सुझाव नहीं दे सकते हैं (होस्टिंग सिस्टम पर दस्तावेज़ों को पढ़ने के अलावा)। हमने आपको भाषा में मानक तंत्र बताया है ... –

3

मुझे लगता है कि मैं स्पष्ट बता रहा हूं, लेकिन eval फ़ाइल में खतरनाक है: कोई भी उपयोगकर्ता [exec whatever they wish] को ऐसी फ़ाइल में एम्बेड कर सकता है।

उन "लेबल" को पढ़ने और एक विशाल स्विच या हैश मानचित्र या पूर्व निर्धारित आदेश निष्पादित करने के लिए जो भी बेहतर होगा, उतना ही बेहतर होगा। गैर-मौजूदा "लेबल" को पकड़ना भी एक गैर-मुद्दा बन जाता है।

+0

मैं सुझाव की सराहना करता हूं। हालांकि, यह वास्तव में मेरे प्रश्न का उत्तर नहीं है और मुझे लगता है कि यह एक टिप्पणी होनी चाहिए। –

+0

यह एक बहुत अच्छा जवाब टीबीएच है। सभी वैध लेबलों की एक सूची रखें, अगर आपने जो पढ़ा है वह उस सूची में नहीं है, तो अपनी पसंद की एक प्रो को कॉल करें। यह समस्या को हल करता है और बूट करने के लिए सुरक्षा जोड़ता है। – ZoFreX

संबंधित मुद्दे