2011-09-15 17 views
11

में एक सामान्य विधि के रूप में अपवाद संभालने के बाद क्या कोई मुझे बता सकता है कि एक सामान्य विधि के रूप में अपवाद हैंडलिंग करने और इसे विधियों के अंदर उपयोग करने का कोई तरीका है? मुझे इसे आगे समझाएं।रुबी

उदाहरण के लिए, मैं निम्नलिखित तरीकों

def add(num1, num2) 
begin 
    num1 + num2 
rescue Exception => e 
    raise e 
end 
end 

def divide(num1, num2) 
begin 
    num1/num2 
rescue Exception => e 
    raise e 
end 
end 

आप देख सकते हैं है, भले ही मेरी विधि अपवाद हैंडलिंग कोड की वजह से है, केवल एक लाइन की जरूरत है, विधि बड़ा हो जाता है।

क्या मैं के लिए देख रहा हूँ (सिर्फ एक विचार) की तरह एक और अधिक स्लिमर समाधान

def add(num1, num2) 
    num1 + num2 unless raise_exception 
end 

def divide(num1, num2) 
num1/num2 unless raise_exception 
end 

def raise_exception 
    raise self.Exception 
end 

कृपया ध्यान दें उपरोक्त कोड काम नहीं करता, बस अपना विचार है। क्या यह संभव है या कोई और अच्छा तरीका है?

+0

ध्यान दें कि आप 'start..end' को समाप्त करके शब्दकोष पर भी कटौती कर सकते हैं, क्योंकि आपके पास एक ही प्रभाव के साथ' def..end' के भीतर 'बचाव' हो सकता है। – hammar

उत्तर

11
def handle_exception(&block) 
    yield 
rescue Exception => e 
    raise e 
end 

def add(num1, num2) 
    handle_exception { num1 + num2 } 
end 

def divide(num1, num2) 
    handle_exception { num1/num2 } 
end 
+0

विचार करने के लिए एक संभावित नकारात्मक पक्ष यह है कि उठाए गए सभी त्रुटियों को उसी पंक्ति संख्या –

+0

पर इंगित किया जाएगा, लेकिन यह एक समेकित उदाहरण भी है। यदि आप केवल त्रुटि को फिर से उठा रहे थे, तो आप इसे पहले स्थान पर पकड़ने से परेशान नहीं होंगे। यदि आपके पास कुछ सामान्य त्रुटि-हैंडलिंग कोड है तो यह उपयोगी होगा। – David

+0

@ डेविड, बहुत बहुत धन्यवाद, यह वही है जो मैं चाहता था ...: डी – sameera207

0

निश्चित रूप से, आप प्रारंभिक अनुभाग के अंदर उत्पन्न होने वाली विधि में एक ब्लॉक पास कर सकते हैं।

+0

त्वरित उत्तर के लिए धन्यवाद, क्या आप मुझे ब्लॉक और उपज कोड नमूना के उदाहरण के उपयोग के लिए निर्देशित कर सकते हैं, धन्यवाद – sameera207

+0

यह आपके लिए ऐसा करने के लिए Google के जितना तेज़ होगा :) –

+0

मेरी समस्या ठीक हो गई, धन्यवाद सहायता के लिए: डी – sameera207

4

हां, ऐसा ही कुछ:

def try 
    yield 
    rescue Exception => e 
    puts 'I`m rescued' 
    end 

    def devide(num1, num2) 
    try { num1/num2 } 
    end 

ruby-1.9.2-p180 :013 > devide(5,1) 
=> 5 
ruby-1.9.2-p180 :014 > devide(5,0) 
I`m rescued 
=> nil 
+0

उत्तर के लिए धन्यवाद, मुझे डेविड के जवाब को स्वीकार करना पड़ा क्योंकि उसने पहले जवाब दिया था, क्षमा करें .. लेकिन फिर से धन्यवाद, यह एक है मैं चाहता था... – sameera207

0

आप एक अपवाद क्यों बचाव और यह समापन बढ़ा सकता हूँ? आपकी कॉलिंग रूटीन को आपके अपवाद को फिर से सहेजना होगा।

आप कर सकता है:

def divide(num1, num2) 
    num1/num2 
end 

begin 
    divide(1,0) 
rescue Exception => e 
    puts "Exception '#{e}' occured" 
end 

आप एक पंक्ति में अपवाद बचाव हो सकता है:

def divide2(num1, num2) 
    num1/num2 rescue Exception 
end 

p divide2(6,3) # -> 2 
p divide2(1,0) # -> Exception 

लेकिन तब आप जानकारी जो अपवाद हुई खो देंगे।