आम तौर पर, आपकी अपवाद हैंडलिंग त्रुटि के निकटतम बिंदु पर होनी चाहिए कि आप अपवाद के साथ कुछ समझदार कर सकते हैं। आपके मामले में, आप चाहते हैं कि आपका rescue
अपने लूप के अंदर, उदाहरण के लिए:
stuff.each do |h|
begin
Model.create(h)
rescue ActiveRecord::RecordNotUnique => e
next if(e.message =~ /unique.*constraint.*INDEX_NAME_GOES_HERE/)
raise
end
end
रुचि के कुछ बिंदु:
- डेटाबेस के अंदर एक बाधा उल्लंघन आपको एक
ActiveRecord::RecordNotUnique
देगा अंतर्निहितPG::Error
. के बजाय त्रुटि . AFAIK, आपको एकPG::Error
मिलेगा यदि आप ActiveRecord के माध्यम से जाने के बजाय सीधे डेटाबेस से बात कर रहे थे। INDEX_NAME_GOES_HERE
बदलें अद्वितीय अनुक्रमणिका के वास्तविक नाम के साथ।- आप केवल उस विशिष्ट बाधा उल्लंघन को अनदेखा करना चाहते हैं जिसकी आप अपेक्षा कर रहे हैं, इसलिए
next if(...)
बिट के बाद तर्कहीनraise
(अर्थात अपवाद को फिर से उठाएं यदि यह वह नहीं है जिसे आप देखने की उम्मीद कर रहे हैं)।