首页 文章

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

提问于
浏览
115

我想在Rails 3应用程序中记录当前的回溯(stacktrace)而不会发生异常 . 知道怎么样?

我为什么要这个?我正在尝试跟踪Rails查找模板时所做的调用,以便我可以选择要覆盖的进程的一部分(因为我想更改我的特定子类控制器的视图路径) .

我想从文件中调用它: gems\actionpack-3.2.3\lib\action_dispatch\middleware\templates\rescues\missing_template.erb . 我知道在堆栈的下游发生了搜索模板的情况 .

3 回答

  • 3

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

    尝试使用

    Thread.current.backtrace
    
  • 10

    我引用异常时使用它来显示自定义错误页面 .

    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
    

相关问题