【问题标题】:How do I get exceptions to render a plain text version of the Rails development error page?如何获取异常以呈现 Rails 开发错误页面的纯文本版本?
【发布时间】:2013-08-22 00:17:49
【问题描述】:

我正在使用 rails-api 构建一个没有 Web 界面的 API。当我在开发中遇到错误时,我希望只看到纯文本中的错误消息和堆栈跟踪,而不需要所有 HTML 包装。如何覆盖全局异常处理,以便在开发模式下以纯文本/JSON 呈现堆栈跟踪,并在生产中呈现通用错误消息?

【问题讨论】:

    标签: ruby-on-rails ruby rails-api


    【解决方案1】:

    我建议从安全角度来看,在生产代码中包含堆栈跟踪可能不是一个好主意。

    我会这样做:

    render :json => {message:exception.message, stack_trace: exception.stacktrace}
    

    我希望这会有所帮助。

    经过山姆的澄清,我可以补充:

    在您的 API 的基本控制器中(可能是 ApplicationController):

    class ApplicationController < ActionController::Base
        ...
        rescue_from Exception do |exception|
            error = {message:exception.message}
            error[:stack_trace] = exception.stacktrace if Rails.env.development?
            render :json => error
        end
        ...
    end
    

    警告:您可能不想以这种方式从每一个异常中解救出来,但如果您这样做了,您会这样做。

    【讨论】:

    • 我应该澄清这个问题 - 我只要求开发模式......以及如何在全球范围内覆盖响应。
    • 我认为stacktrace 是一个错字,应该是backtrace
    【解决方案2】:

    对@donleyp answer 的一些改进可以在 Rails 3.2 中获得清晰的跟踪并在生产中输出通用错误信息:

    class ApplicationController < ActionController::API   
        ...   
        rescue_from Exception do |exception|
            if Rails.env.development?
                error = {message:exception.message}
                error[:application_trace] = Rails.backtrace_cleaner.clean(exception.backtrace) 
                error[:full_trace] = exception.backtrace 
                render :json => error
            else
                render :text => "Internal server error.", :status => 500
            end   
        end
        ...    
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 2020-07-24
      • 1970-01-01
      相关资源
      最近更新 更多