exceptions excepciones custom ruby stack-trace

excepciones - Obtener el seguimiento de pila actual en Ruby sin generar una excepción



excepciones en ruby (3)

Intenta usar

Thread.current.backtrace

Quiero registrar la traza inversa actual (stacktrace) en una aplicación de Rails 3 sin que se produzca una excepción. Alguna idea de como?

¿Por qué quiero esto? Estoy tratando de rastrear las llamadas que se realizan cuando Rails busca una plantilla para que pueda elegir una parte del proceso para anular (porque quiero cambiar la ruta de vista de un controlador subclasificado particular mío).

Me gustaría llamarlo desde el archivo: gems/actionpack-3.2.3/lib/action_dispatch/middleware/templates/rescues/missing_template.erb . Sé que no es una buena práctica, pero sé que está más abajo de la pila desde donde ocurre la búsqueda de plantillas.


Lo uso para mostrar una página de error personalizada cuando se generan excepciones.

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


Puede usar 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

Salida:

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