मैं रेल में एक अपवाद कैसे बढ़ाऊं ताकि यह अन्य रेल अपवादों की तरह व्यवहार करे?


91

मैं एक अपवाद उठाना चाहूंगा ताकि यह वही काम करे जो एक सामान्य रेल अपवाद करता है। विशेष रूप से, विकास मोड में अपवाद और स्टैक ट्रेस दिखाएं और उत्पादन मोड में "हमें खेद है, लेकिन कुछ गलत हो गया" पृष्ठ दिखाते हैं।

मैंने निम्नलिखित कोशिश की:

raise "safety_care group missing!" if group.nil?

लेकिन यह सिर्फ "ERROR signing up, group missing!"development.log फ़ाइल को लिखता है


2
आपके द्वारा पोस्ट किया गया त्रुटि संदेश इस अपवाद से नहीं लगता है (यह एक अलग संदेश है) क्या यह वास्तव में आप देख रहे हैं?
लेविनलैक्स

जवाबों:


139

आपको कुछ खास करने की जरूरत नहीं है, बस काम करना चाहिए।

जब मेरे पास इस नियंत्रक के साथ एक नया रेल एप्लिकेशन होगा:

class FooController < ApplicationController
  def index
    raise "error"
  end
end

और जाएं http://127.0.0.1:3000/foo/

मैं एक स्टैक ट्रेस के साथ अपवाद देख रहा हूं।

आप कंसोल लॉग में पूरे स्टैकट्रेस को नहीं देख सकते हैं क्योंकि रेल (2.3 के बाद से) स्टैक ट्रेस से लाइनों को फिल्टर करती है जो फ्रेमवर्क से ही आती हैं।

config/initializers/backtrace_silencers.rbअपनी रेल परियोजना में देखें


2
बहुत बढ़िया, संक्षिप्त जवाब।
rcd

1
स्किच लिंक (स्टैक ट्रेस के साथ अपवाद को देखते हुए) अब काम नहीं कर रहा है
आसफ

@ एलिविनलेक्स स्टैकट्रेस दिखाने के लिए प्रोडक्शन मोड में सुरक्षित रहेगा?
BKSpurgeon

@levinalex - धन्यवाद एलेक्स। क्या त्रुटि संदेश में कस्टम स्ट्रिंग जोड़ने का कोई तरीका है?
BKSpurgeon

62

आप इसे इस तरह से कर सकते हैं:

class UsersController < ApplicationController
  ## Exception Handling
  class NotActivated < StandardError
  end

  rescue_from NotActivated, :with => :not_activated

  def not_activated(exception)
    flash[:notice] = "This user is not activated."
    Event.new_event "Exception: #{exception.message}", current_user, request.remote_ip
    redirect_to "/"
  end

  def show
      // Do something that fails..
      raise NotActivated unless @user.is_activated?
  end
end

आप यहाँ क्या कर रहे हैं एक क्लास "NotActivated" बना रहे हैं जो अपवाद के रूप में काम करेगा। उठाना का उपयोग करके, आप अपवाद के रूप में "NotActivated" फेंक सकते हैं। रेस्क्यू_फ्रॉम एक निर्दिष्ट विधि के साथ एक अपवाद को पकड़ने का तरीका है (इस मामले में not_activated)। काफी लंबा उदाहरण है, लेकिन यह आपको दिखाता है कि यह कैसे काम करता है।

शुभकामनाएं,
फैबियन


यह विकास मोड में अपवाद और स्टैक ट्रेस नहीं दिखाता है और "हमें खेद है, लेकिन उत्पादन मोड में कुछ गलत हो गया" पृष्ठ दिखाता है।
चिराग पटेल

2
"हमें खेद है" पृष्ठ वास्तव में आपके वेब सर्वर का 500 त्रुटि हैंडलर है। अपनी .htaccess फ़ाइल की जाँच करें और आप इसे आम तौर पर वहाँ देखेंगे
जेफ पाक्वे

शायद ओपी का जवाब नहीं लेकिन बहुत उपयोगी उदाहरण है, धन्यवाद!
नील स्टॉकब्रिज

11

यदि आपको इसे करने के लिए एक आसान तरीका चाहिए, और अधिक उपद्रव नहीं चाहिए, तो एक सरल निष्पादन हो सकता है:

raise Exception.new('something bad happened!')

यह एक अपवाद बढ़ा देंगे, कहते हैं eके साथe.message = something bad happened!

और फिर आप इसे बचाव कर सकते हैं क्योंकि आप सामान्य रूप से अन्य सभी अपवादों को बचा रहे हैं।


यह 'एक्सेप्शन' को बढ़ाने या बचाने के लिए एक अच्छा विचार नहीं है, इसके बजाय StandardError का उपयोग करने का प्रयास करें। विवरण के लिए इसे देखें: stackoverflow.com/questions/10048173/…
एकमजीत सिंह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.