2012-02-02 6 views
11

मेरे पास दो बचाव_ हैंडलर हैं, एक 404 हैंडलर हैं, और सभी हैंडलर पकड़ते हैं। पकड़ हमेशा सभी ActiveRecord :: RecordNotFound अपवादों के लिए बुलाया जाता है और 404 हैंडलर कभी नहीं बुलाया जाता है। मेरी उम्मीद यह है कि अधिक विशिष्टता वाले हैंडलर को बुलाया जाएगा लेकिन ऐसा नहीं होता है।मैं कैसे निर्धारित करूं कि कौन से अपवाद हैंडलर rescue_from रेल में चयन करेंगे?

application_controller.rb

# ActiveRecord 404 
rescue_from ActiveRecord::RecordNotFound do |e| 
    ... 
end 

# Catch all unhandled exceptions 
rescue_from Exception do |e| 
    ... 
end 

api docs for rescue_from निम्नलिखित कहते हैं:

हैंडलर लिए गए हैं। उन्हें से नीचे तक, और पदानुक्रम तक दाएं से बाएं से खोजा जाता है। प्रथम श्रेणी का हैंडलर जिसके लिए upgrade.is_a? (Klass) सत्य है, अगर कोई भी है।

क्या मैं इस बारे में गलत बयान की व्याख्या कर रहा हूं। मैं उस व्यवहार को कैसे प्राप्त करूं जो मैं ढूंढ रहा हूं?

उत्तर

13

404 हैंडलर कभी नहीं बुलाया जाता है क्योंकि पकड़ हमेशा आपके उदाहरण में पहले कहा जाता है। समस्या हैंडलर परिभाषाओं के क्रम में है। उनका मूल्यांकन नीचे से ऊपर तक किया जाता है जिसका अर्थ है कि आपके अंतिम परिभाषित हैंडलर की सर्वोच्च प्राथमिकता होगी और आपके पहले परिभाषित हैंडलर की सबसे कम प्राथमिकता होगी। यदि आप ऑर्डर स्विच करते हैं तो आपको वह व्यवहार मिलेगा जो आप चाहते हैं।

# Catch all unhandled exceptions 
rescue_from Exception do |e| 
    ... 
end 

# ActiveRecord 404 
rescue_from ActiveRecord::RecordNotFound do |e| 
    ... 
end 
+0

मैंने पहले भी कोशिश की और यह काम नहीं लग रहा था लेकिन अब यह करता है। धन्यवाद। –

+2

मेरा सुझाव है कि 'अपवाद' को कभी भी न बचाएं क्योंकि यह अन्य सभी अपवादों की ईश्वर मां है। यह आपकी वाक्यविन्यास त्रुटियों या जो कुछ भी बचाएगा। – Hendrik

+1

स्टैंडर्ड एरर कैच-ऑल क्लास होगा। – Duke

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^