2012-11-20 11 views
5

catch गहरा घोंसला कोड से बाहर निकलने के लिए है। जावा में उदा। अपवादों को संभालने के लिए जावा के try-catch के साथ इसे हासिल करना संभव है, हालांकि इसे खराब समाधान माना जाता है और यह भी बहुत अक्षम है। अपवादों को संभालने के लिए रुबी में हमारे पास begin-raise-rescue है और मुझे लगता है कि इसे अन्य कार्यों के लिए उपयोग करने के लिए महंगा भी है।रूबी कैच-फेंक और दक्षता

क्या रूबी का catch-throw वास्तव में begin-raise-rescue पर एक और अधिक कुशल समाधान है या begin-raise-rescue के बजाय नेस्टेड ब्लॉक को तोड़ने के लिए इसका उपयोग करने के अन्य कारण हैं?

+0

यदि आप नियंत्रण संरचनाओं के कुछ रूबी उदाहरण पोस्ट करते हैं, तो आप यह पूछ सकते हैं कि आपका क्या मतलब है। बेंचमार्किंग के लिए –

उत्तर

5

नियंत्रण संरचनाओं से बाहर निकलने के लिए "सही" तरीका होने के अलावा, catch-throw भी काफी तेज़ है (मेरे परीक्षण में तेज़ 10 गुना)। मेरे कोड और परिणामों के लिए this gist देखें।

+0

+1। – steenslag

+0

धन्यवाद! बेंचमार्क वास्तव में इस मुद्दे को साफ़ करता है (मेरे मामले में यह लगभग 15 गुना है!)। क्या पकड़-फेंक को प्रोग्रामिंग की संरचनात्मक शैली माना जाना चाहिए - फिर बेहतर अभ्यास तो गोटो को तुच्छ जाना? – wrzasa

+0

यह आपके डिजाइन को पकड़ने की आवश्यकता है, शायद एक बेहतर डिजाइन है। ऐसा कहा जा रहा है कि निश्चित रूप से किनारे के मामले हैं जहां पकड़ फेंक बहुत अधिक समझ में आता है, खासतौर पर मणि में विकसित होता है जहां आप नहीं जानते कि अंतिम उपयोगकर्ता इसका उपयोग कैसे करेगा। – Josh

5

Josh's answer सही है। मैं catch-throw और raise-rescue के बारे में अधिक जानकारी जोड़ना चाहता हूं।

catch-throw प्रवाह नियंत्रण के लिए उपयोग किया जाता है जबकि raise-rescue अपवाद/त्रुटि प्रबंधन के लिए उपयोग किया जाता है। अलग है: backtracecatch-throw (प्रवाह नियंत्रण) के लिए आवश्यक नहीं है। मेरा विश्वास करो, मुख्य कारण raise-rescuecatch-throw से धीमा चलता है Josh's gist में 10 बार raise-rescuebacktrace ऑब्जेक्ट बनाने के लिए बहुत समय लगता है।

raise <type>, <message>, <backtrace> 

चेकआउट my gist:

आप पश्व-अनुरेखन बिना raise चाहते हैं, वाक्य विन्यास का उपयोग। raise without backtraceraise with backtrace से बहुत तेज है।

अप्रैल वर्ष 2016 अद्यतन:

मैं my gist नवीनीकृत किया है:

  • फिक्स्ड "तोड़ने" परीक्षण
  • जोड़ा गया बेंचमार्क परीक्षणों को नए रूबी संस्करण 2.1.8, 2.2.4 के लिए परिणाम, 2.3.0
संबंधित मुद्दे