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>''