2013-08-22 19 views
8

Tôi đang sử dụng rails-api để xây dựng một API không có giao diện web. Khi tôi gặp lỗi trong quá trình phát triển, tôi chỉ muốn xem thông báo lỗi và stacktrace ở dạng văn bản thuần túy mà không có tất cả gói HTML. Làm cách nào để ghi đè lên xử lý ngoại lệ toàn cục để nó hiển thị stacktrace trong chế độ phát triển trong văn bản thuần túy/JSON và thông báo lỗi chung trong sản xuất?Làm cách nào để nhận ngoại lệ để hiển thị phiên bản thuần văn bản của trang lỗi phát triển Rails?

Trả lời

3

Tôi khuyên bạn nên bao gồm dấu vết ngăn xếp trong mã sản xuất có lẽ không phải là ý tưởng tốt từ điểm bảo mật.

Dưới đây là làm thế nào tôi sẽ làm điều đó:

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

Tôi hy vọng điều này sẽ giúp.

Sau khi làm rõ Sam tôi có thể thêm:

Trong điều khiển cơ sở của bạn đối với API của bạn (có thể là 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 

Nên biết trước: Bạn có thể không muốn giải cứu từ mọi ngoại lệ duy nhất trong cách này nhưng đây là cách bạn sẽ làm điều đó nếu bạn đã làm.

+1

tôi nên làm rõ các câu hỏi - Tôi đang yêu cầu cho chế độ phát triển chỉ ... và cách ghi đè phản hồi trên toàn cầu. –

+2

Tôi nghĩ rằng 'stacktrace' là một lỗi đánh máy, và nên là' backtrace'. – Jacob

2

Một số cải tiến so với câu trả lời @donleyp để có được một dấu vết sạch trong Rails 3.2 và đầu ra generic thông tin lỗi trong sản xuất:

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 
Các vấn đề liên quan