ব্যতিক্রম না বাড়িয়ে রুবিতে বর্তমান স্ট্যাক ট্রেস পান


139

আমি ব্যতিক্রম ব্যতীত একটি রেল 3 অ্যাপে বর্তমান ব্যাকট্রিজ (স্ট্যাকট্রেস) লগ করতে চাই । কোন ধারণা কিভাবে?

আমি এটা কেন চাই? আমি যখন কলগুলি কোনও টেম্পলেট সন্ধান করি তখন যে কলগুলি করা হয় সেগুলি সনাক্ত করার চেষ্টা করি যাতে আমি ওভাররাইড করার জন্য প্রক্রিয়াটির একটি অংশ বেছে নিতে পারি (কারণ আমি আমার নির্দিষ্ট সাবক্ল্যাসড কন্ট্রোলারের জন্য দৃষ্টিভঙ্গিটি পরিবর্তন করতে চাই)।

আমি এটা ফাইল থেকে কল করতে চাই: gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb। আমি জানি যে এটি সর্বোত্তম অনুশীলন নয়, তবে আমি জানি এটি স্ট্যাকের নীচে যেখানে টেমপ্লেটগুলির জন্য অনুসন্ধান ঘটে।


4
নোংরা সমাধান: সেখানে একটি ব্যতিক্রম উত্থাপন করুন, অবিলম্বে এটি উদ্ধার করুন এবং লগ করুন e.backtrace। আমি যে প্রকল্পগুলির সাথে কাজ করছি তার একটিতে আমি এটি দেখেছি। সর্বোত্তম পদ্ধতির নয়, তবে এটি কার্যকর। তবে অন্য কারও কাছ থেকে আরও ভাল সমাধান শোনার আশা করি।
কেএল -7

উত্তর:


185

আপনি ব্যবহার করতে পারেন 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>'

তাই না Kernel.caller- বিন্দু দিয়ে? Kernel.new.callerএখানে এখানে সংজ্ঞায়িত করা হয়নি
বাস্তুতন্ত্রিক

8
না, প্রযুক্তিগতভাবে callerএকটি উদাহরণ পদ্ধতি। যেহেতু Kernelমডিউলটি প্রতিটি রুবি শ্রেণিতে অন্তর্ভুক্ত রয়েছে ( BasicObject1.9 ব্যতীত ), এটি কোনও বস্তুর উদাহরণ পদ্ধতি হিসাবে উপলব্ধ (এটি ব্যক্তিগত, যদিও)। আপনি Kernel.new.callerমডিউলটি ইনস্ট্যান্ট করতে না পারার কারণে এটি এটিকে কল করতে পারেন না (এটির কোনও newপদ্ধতি নেই)।
কেএল -7

এই কোনও কলারের সংখ্যা এড়াতে একটি প্যারামিটার সমর্থন করে; দেখুন: stackoverflow.com/a/3829269/520567
akostadinov

7
সুন্দর মুদ্রণ ব্যবহারের জন্য - Rails.logger.debug caller.join("\n")বা puts caller.join("\n")। ধন্যবাদ।
জিগনেশ গোহেল

20

ব্যবহার করার চেষ্টা করুন

Thread.current.backtrace

1
এই উত্তরের সুবিধাটি হ'ল এটি ব্যাকট্রেসে বর্তমান পদ্ধতিটি অন্তর্ভুক্ত করে , যদিওKernel#caller বর্তমান পদ্ধতিটি বাদ পড়ে। যেমন MyClass.new.returns_caller => ["(irb):42:in 'irb_binding'",...] তেমন সহায়ক নয় MyClass.new.returns_thread_backtrace => ["(irb):38:in 'backtrace'","(irb):38:in 'returns_thread_backtrace'","(irb):43:in 'irb_binding'",...]
stwr667

6

আমি ব্যতিক্রম উত্থাপিত হয় যখন একটি কাস্টম ত্রুটি পৃষ্ঠা প্রদর্শন করতে এটি ব্যবহার।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.