在 Ruby 中获取当前堆栈跟踪而不引发异常

我想记录当前的回溯(堆栈跟踪)在 Rails 3应用程序 没有一个异常发生。有什么办法吗?

我为什么想要这个?我试图跟踪在 Rails 查找模板时发出的调用,这样我就可以选择要覆盖的流程的一部分(因为我想更改我的特定子类控制器的视图路径)。

我想从文件中把它命名为: gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb。我知道这不是最佳实践,但是我知道这是从搜索模板的地方开始的栈的下游。

67742 次浏览

你可以使用 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>'

当引发异常时,我使用它来显示自定义错误页面。

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

尝试使用

Thread.current.backtrace