8

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

4

2 回答 2

3

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

这是我的做法:

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

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

于 2013-08-22T00:38:53.227 回答
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
于 2014-09-16T20:34:33.500 回答