रूबी में फेल कीवर्ड क्या करता है?


88

मैं रूबी सीख रहा हूं और failकीवर्ड का सामना कर रहा हूं । इसका क्या मतलब है?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end

8
नीचे दिए गए उत्तरों के अलावा, यह जानने के लायक है कि लोग raiseअपवादों को संभालने के लिए उपयोग करते हैं और failकब नहीं।
बाला

6
यह एक खोजशब्द नहीं है, यह एक विधि है।
जोर्ग डब्ल्यू मित्तग


यह भी ध्यान दें, आप इन्हें सिंगल लाइन स्टेटमेंट्स के रूप में लिख सकते हैं: fail "Password too short" if password.length < 8औरfail "No user name set" unless username
PhilT

जवाबों:


136

रूबी में, failपर्यायवाची है raisefailकीवर्ड की एक विधि है Kernelमॉड्यूल जो वर्ग द्वारा शामिल किया गया है Objectfailविधि की तरह ही एक रनटाइम त्रुटि को जन्म देती raiseकीवर्ड।

failविधि तीन भार के होते हैं:

  • fail: RuntimeErrorएक त्रुटि संदेश के बिना उठाता है ।

  • fail(string): RuntimeErrorएक त्रुटि संदेश के रूप में स्ट्रिंग तर्क के साथ उठता है :

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): exceptionवैकल्पिक त्रुटि संदेश (दूसरा तर्क) और कॉलबैक जानकारी (तीसरा तर्क) के साथ वर्ग (प्रथम तर्क) के अपवाद को उठाता है ।

    उदाहरण: मान लें कि आप एक फ़ंक्शन को परिभाषित करते हैं जिसे खराब तर्क दिया जाना चाहिए। इसे उठाना बेहतर है ArgumentErrorऔर न कि RuntimeError:

    fail ArgumentError, "Illegal String"
    

    एक और उदाहरण: आप पूरे बैकट्रेस को failविधि में पास कर सकते हैं ताकि आप rescueब्लॉक के अंदर ट्रेस तक पहुंच सकें :

    fail ArgumentError, "Illegal String", caller
    

    callerएक कर्नेल विधि है, जो फॉर्म में स्ट्रिंग्स की एक सरणी के रूप में बैकट्रेस देता है file:line: in 'method'

कोई तर्क के साथ, अपवाद $ में उठाता है! या यदि $ RuntimeError उठाता है! nil है। एक एकल स्ट्रिंग तर्क के साथ, एक संदेश के रूप में स्ट्रिंग के साथ एक रनटाइमएयर उठाता है। अन्यथा, पहला पैरामीटर अपवाद श्रेणी (या एक ऑब्जेक्ट जो अपवाद संदेश भेजे जाने पर अपवाद वस्तु लौटाता है) का नाम होना चाहिए। वैकल्पिक दूसरा पैरामीटर अपवाद से जुड़े संदेश को सेट करता है, और तीसरा पैरामीटर कॉलबैक जानकारी की एक सरणी है। अपवाद शुरू ... अंत ब्लॉकों के बचाव खंड द्वारा पकड़े जाते हैं।

स्रोत: कर्नेल मॉड्यूल पर रूबी प्रलेखन


2
क्या आप 3 बुलेट बिंदुओं के साथ 3 सरल उदाहरण दे सकते हैं? यह आपके उत्तर को और अधिक ठोस बना देगा .. :)
अरूप रक्षित

1
वाह, +1, रूबी डॉक्स रूबी-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)) से बेहतर है )
बोरिस स्टिटनिक

इसने मेरे लिए काम किया लेकिन रूबोकॉप ने इसे बदल दियाraise
पॉल

32

रूबोकॉप दोनों शब्दों के उपयोग के बारे में कहता है;

' सिग्नल अपवादों के failबजाय उपयोग करें raise।'

' पुनर्विचार अपवादों के raiseबजाय उपयोग करें fail।'

यहाँ एक उदाहरण है।

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end

शैली सलाहकार के लिए +1; यहां तक ​​कि अगर वे समान रूप से अपनी इच्छित सेटिंग में प्रत्येक का उपयोग कर रहे हैं, तो इरादे को बेहतर बनाने में मदद मिलती है
फेटुहोकू

26

fail == raise

दूसरे शब्दों में, त्रुटि उठाने की विधि के failलिए सिर्फ एक लोकप्रिय उपनाम है raise। उपयोग:

fail ArgumentError, "Don't argue with me!"

7

www.ruby-doc.org आपका मित्र है। जब मैंने rubydoc fail" कर्नेल " को पहली बार हिट किया था। मेरी सलाह है, जब संदेह हो, तो इस तरह के निश्चित सामान के लिए निश्चित स्रोत पर जाएं।


2
वूट, जो वास्तव में एक विफलता है। फेल के लिए कोड उदाहरण o_O से कॉपी-पेस्ट है
Vajk Hermecz

4
@VajkHermecz उठाना एक उपनाम है, इसलिए यह प्रलेखन का पुन: उपयोग करता है। Array # मैप और Array # लीजिए
Jamie Macey
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.