2012-06-20 13 views
108

मैं रेलवे 3 एप में बिना किसी अपवाद होने के वर्तमान बैकट्रैक (स्टैकट्रैक) को लॉग करना चाहता हूं। कोई विचार कैसे?अपवाद को उठाए बिना रुबी में वर्तमान स्टैक ट्रेस प्राप्त करें

मुझे यह क्यों चाहिए? मैं रेलों को टेम्पलेट की तलाश करते समय किए गए कॉल का पता लगाने की कोशिश कर रहा हूं ताकि मैं ओवरराइड करने के लिए प्रक्रिया का एक हिस्सा चुन सकूं (क्योंकि मैं अपने किसी विशेष उप-नियंत्रक नियंत्रक के लिए दृश्य पथ बदलना चाहता हूं)।

मैं इसे फ़ाइल से कॉल करना चाहता हूं: gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb। मुझे पता है कि यह सबसे अच्छा अभ्यास नहीं है, लेकिन मुझे पता है कि यह स्टैक की डाउनस्ट्रीम है जहां से टेम्पलेट्स की खोज होती है।

+4

गंदा समाधान का उपयोग कर प्रयास करें: वहाँ एक अपवाद बढ़ा, इसे तुरंत बचाव और लॉग 'e.backtrace'। मैंने इसे उन परियोजनाओं में से एक में देखा है जिनके साथ मैं काम कर रहा हूं। सबसे अच्छा दृष्टिकोण नहीं है, लेकिन यह काम करता है। हालांकि, किसी और से बेहतर समाधान सुनने की उम्मीद है। –

+0

शानदार। धन्यवाद। – JellicleCat

उत्तर

155

आप Kernel#caller उपयोग कर सकते हैं:

# /tmp/caller.rb 

def foo 
    puts caller # Kernel#caller returns an array of strings 
end 

def bar 
    foo 
end 

def baz 
    bar 
end 

baz 

आउटपुट:

caller.rb:8:in `bar' 
caller.rb:12:in `baz' 
caller.rb:15:in `<main>' 
+0

बहुत आसान, बहुत सरल - धन्यवाद! –

+0

क्या यह 'कर्नेल.caller' नहीं है - एक बिंदु के साथ? 'कर्नेल.न्यू कल्लर' को – ecoologic

+7

पर परिभाषित नहीं किया गया है, तकनीकी रूप से 'कॉलर' एक उदाहरण विधि है। चूंकि प्रत्येक रूबी वर्ग में 'कर्नेल' मॉड्यूल शामिल है (1.99 में 'मूल ऑब्जेक्ट' को छोड़कर), यह किसी ऑब्जेक्ट पर उदाहरण विधि के रूप में उपलब्ध है (हालांकि यह निजी है, हालांकि)। आप इसे 'कर्नेल.न्यू कल्लर' के रूप में नहीं कह सकते हैं क्योंकि आप मॉड्यूल को चालू नहीं कर सकते हैं (इसमें 'नई' विधि नहीं है)। –

3

मैं इस का उपयोग एक परिष्कृत त्रुटि पृष्ठ दिखाने के लिए जब अपवाद उठाए गए हैं।

rescue_from Exception do |exception| 
    logger.error exception.class 
    logger.error exception.message 
    logger.error exception.backtrace.join "\n" 
    @exception = exception 


    # ExceptionNotifier::Notifier.exception_notification env, @exception 

    respond_to do |format| 
    if [AbstractController::ActionNotFound, ActiveRecord::RecordNotFound, ActionController::RoutingError, ActionController::UnknownAction].include?(exception.class) 
     format.html { render :template => "errors/404", :status => 404 } 
     format.js { render :nothing => true, :status => 404 } 
     format.xml { render :nothing => true, :status => 404 } 
    elsif exception.class == CanCan::AccessDenied 
     format.html { 
     render :template => "errors/401", :status => 401 #, :layout => 'application' 
     } 
     # format.js { render :json => { :errors => [exception.message] }, :status => 401 } 
     # format.js { render :js => 'alert("Hello 401")' } 
     format.js { render :template => 'errors/401.js.erb' } 

    else 
     ExceptionNotifier::Notifier.exception_notification(env, exception).deliver   
     format.html { render :template => "errors/500", :status => 500 } #, :layout => 'im2/application' } 
     # format.js { render :nothing => true, :status => 500 } 
     format.js { render :template => 'errors/500.js.erb' } 

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