2011-08-30 16 views
15

यहां स्थिति है। मैं कोड के माध्यम से बुलबुला करने के लिए doStuff() में सभी अपवाद चाहता हूं ताकि उन्हें उच्च स्तर पर संभाला जा सके।रूबी रीराइजिंग अपवाद w/अतिरिक्त स्ट्रिंग तर्क

मैं भी रिकॉर्ड करने के लिए कितनी बार किसी भी अपवाद() एक उच्च स्तर पर doStuff में क्या हो रहा है, वे भी चाहते हैं, और वर्तमान में यह कर रहा हूं:

begin 
    doStuff() 
rescue Exception => 
    raise e, "specific error to log in a db" 

doStuff कोड अपवाद के दर्जनों फेंक, और मैं इन घटनाओं में से प्रत्येक को डीबी में डालने के लिए कैप्चर करना चाहता हूं। एक doStuff2() है, जो समान निर्देशों को भी फेंक सकता है, और मैं जानना चाहता हूं कि वे किस समारोह से आए थे।

अतिरिक्त स्ट्रिंग जोड़ना, अपवाद को बदलना प्रतीत होता है, और मैं मूल अपवाद के बारे में सभी अच्छी स्वरूपण और ट्रेस जानकारी खो देता हूं।

कोई भी सुझाव मैं मूल अपवाद को कैसे पुनः प्राप्त कर सकता हूं, लेकिन doStuff() के भीतर होने वाले सभी अपवादों का भी ट्रैक रखता हूं?

उत्तर

48

यदि आप raise पर किसी भी तर्क के बिना कॉल करते हैं, तो रूबी अंतिम अपवाद को फिर से उठाएगा।

begin 
    doStuff() 
rescue => e 
    log_exception(e) 
    raise # This will re-raise the last exception. 
end 

एक तरफ ध्यान दें के रूप में, मैं तुम्हें रूबी सर्वोत्तम प्रथाओं के बारे में कुछ सुझाव देना चाहते हैं।

  1. doStuff() विधि रूबी नामकरण सम्मेलनों का पालन नहीं करती है। आपको विधियों के लिए अंडरस्कोर का उपयोग करना चाहिए। कृपया do_stuff का उपयोग करें। इसके अलावा, यदि कोई तर्क नहीं है तो () का उपयोग करने की आवश्यकता नहीं है।
  2. अपवाद को कभी भी बचाएं, इसके बजाय आपको सबसे कम स्तर की कक्षा को बचाने के लिए बचाव की आवश्यकता है। ज्यादातर मामलों में, आप सभी प्रकार के मानक एरर या रनटाइम एरर को सहेजना चाहेंगे। वास्तव में, यदि आप त्रुटि प्रकार को पार किए बिना बचाव का उपयोग करते हैं, तो रूबी स्वचालित रूप से मानक त्रुटि के किसी भी उप-वर्ग को बचाएगी। Exception कक्षा बहुत कम स्तर है और यह सिंटैक्स त्रुटियों को भी पकड़ लेगी, और कई अन्य संकलक मुद्दों को भी प्रभावित करेगा। आप इस मामले में एप्लिकेशन क्रैश को छोड़ना चाहेंगे ताकि आप टूटे हुए एप्लिकेशन को तैनात नहीं कर रहे हों।
+0

doStuff (बढ़ाने के लिए कोई नया अपवाद निर्माण खेद सिर्फ छद्म कोड था, कर सकते हैं। समस्या यह है कि मैं यहां अपवाद लॉग नहीं कर सकता। लॉगिंग एक उच्च स्तर पर होना है। यह ऐप 'गूंगा' है और डेटाबेस या लॉगिंग के बारे में कुछ भी नहीं जानता है। मुझे पता है कि मैं एक साथ 2 अपवाद नहीं बढ़ा सकता, लेकिन इससे मेरी समस्या हल हो जाएगी। उनमें से एक पकड़ा और लॉग हो जाएगा, और दूसरा अभी भी कोड में बुलबुला होगा। –

2

आप एक नया अपवाद नहीं उठा सकते हैं और पिछले अपवाद और बॉक्स के बाहर अपने स्टैकट्रैक को सहेज सकते हैं। जावा दुनिया से नेस्टेड अपवाद दुर्भाग्यवश बॉक्स से बाहर नहीं हैं। यह रूबी 2.1 में उपलब्ध होगा। यह काफी गर्म विषय है। https://bugs.ruby-lang.org/issues/8257

आप अभी भी nesty मणि का उपयोग कर सकते हैं। आपको केवल अपवाद वर्गों में include Nesty::NestedError की आवश्यकता है। और जानकारी यहां है: https://github.com/skorks/nesty/

3

आप पश्व-अनुरेखन और पहली अपवाद के संदेश को बचाने और)

begin 
rescue Exception => e 
    new_ex = Exception.new("Error while executing ...:#{e.message}") 
    new_ex.set_backtrace(e.backtrace) 
    raise new_ex 
end 
संबंधित मुद्दे