2009-02-12 11 views
36

मैं यह समझने की कोशिश कर रहा हूं कि रूबी 1.8.6 में eval() आईएनजी कोड में आने वाली वाक्यविन्यास त्रुटियों को कैसे बचाया जाए।रूबी में एक eval कैसे बचाव करने के लिए?

मैं निम्नलिखित रूबी कोड उम्मीद करेंगे:

#!/usr/bin/ruby 

good_str = "(1+1)" 
bad_str = "(1+1" # syntax error: missing closing paren 

begin 
    puts eval(good_str) 
    puts eval(bad_str) 
rescue => exc 
    puts "RESCUED!" 
end 

निम्नलिखित परिणाम उपज जब चलाएँ:

2 
RESCUED! 

इसके बजाय, मैं क्या मिलता है:

2 
eval_rescue.rb:8: (eval):1: compile error (SyntaxError) 
(eval):1: syntax error, unexpected $end, expecting ')' 

ऐसा प्रतीत होता है कि eval विधि द्वारा उठाया SyntaxError मुझे एक मौका देने के बिना, eval के भीतर कहीं बचाया जा रहा है ओ इसे खुद संभाल लें।

किसी को भी कोई विचार है कि मैं जिस व्यवहार को चाहता हूं उसे प्राप्त करने के लिए (यानी, 'eval' से त्रुटि को पकड़ने के लिए मेरे 'बचाव' खंड के लिए)?

उत्तर

41

ठीक है, कि आसान था ...

ऐसा लगता है कि डिफ़ॉल्ट रूप से, "बचाव" बयान सभी अपवाद पकड़ नहीं करता है, लेकिन केवल उन है कि StandardError की उपवर्गों हैं। SyntaxError मानक एरर का एक भाई/चचेरा भाई है, इसका उप-वर्ग नहीं है, इसलिए बचाव कथन इसे तब तक कैप्चर नहीं करता जब तक कि स्पष्ट रूप से बताया न जाए।

बचाव ब्लॉक कब्जा सभी अपवाद के लिए, आप करने के लिए कोड को बदलने की जरूरत है:

#!/usr/bin/ruby 

good_str = "(1+1)" 
bad_str = "(1+1" # syntax error: missing closing paren 

begin 
    puts eval(good_str) 
    puts eval(bad_str) 
rescue Exception => exc 
    puts "RESCUED!" 
end 

नोट करने के लिए "बचाव" लाइन में परिवर्तन, "बचाव => exc" से "बचाव अपवाद => exc"।

अब, जब आप कोड चलाने के लिए, आप इच्छित परिणाम प्राप्त:

2 
RESCUED! 
+0

देखने के लिए कृपया इस: http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby – gamov

45

ब्रेंट पहले से ही एक answer that works है, लेकिन मुझे अपवाद आप के साथ प्राप्त कर सकते हैं का सबसे छोटा सेट से बचाव की सलाह देते हैं। यह सुनिश्चित करता है कि आप किसी ऐसे चीज को गलती से नहीं कर रहे हैं जिसका आप मतलब नहीं है।

इस प्रकार,

begin 
    puts eval(good_str) 
    puts eval(bad_str) 
rescue SyntaxError => se 
    puts 'RESCUED!' 
end 
+6

यह अच्छी सलाह है। उदाहरण के लिए, SyntaxError की बजाय अपवाद को सहेजने से आप अपनी प्रक्रिया को ctrl-c से बाधित कर सकते हैं। –

+0

मुझे आश्चर्य है कि यह एक सर्वोत्तम अभ्यास के रूप में अधिक नहीं पकड़ा गया है। – tamouse

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