Как автоматически регистрировать исключения в Rails? - PullRequest
1 голос
/ 20 февраля 2011

Если в действии контроллера есть исключение и используется rescue, Rails не показывает исключение ни в браузере (который является O.K), ни записывает исключение в файл журнала.

Есть ли способ заставить Rails записать исключение в файл журнала в этом случае?

Пример:

def some_action
  2/0
rescue
  #this code is called, but Rails does not write the exception to the log
end

Ответы [ 2 ]

3 голосов
/ 20 февраля 2011

Вы спасаете исключение, поэтому оно не будет заноситься в журнал, потому что на самом деле ничего плохого не произошло, поскольку оно фактически было "спасено".

Вы можете поместить следующий код в rescueблок для записи в журнал:

logger.warn "Exception rescued!"

Подробнее об использовании регистратора читайте в Руководстве по Rails .

0 голосов
/ 20 февраля 2011

Я закончил с использованием rescue_from в ApplicationController, зарегистрировав сообщение об исключении и обратный след, а затем с помощью params[:controller] и params[:action], чтобы определить, на какой контроллер / действие перенаправить.

Например, если исключено PostsController#show исключение, я бы перенаправил на PostsController#index с в rescue_from.До сих пор он работал , так что не кажется плохой вещью для redirect_to изнутри rescue_from.Время даст мне знать, я уверен!(Просто нужно убедиться, что мои перенаправления не вызывают бесконечные циклы!)

И просто кто-то заинтересован в этом взломать (попробуйте на свой страх и риск!):

class ApplicationController < ActionController::Base

  def determine_redirect_to_path(controller,action)
    ...
  end

  rescue_from StandardError do |exception|    
    backtrace_size = exception.backtrace.size
    if backtrace_size >= 2 then max_range = 2
    elsif backtrace_size >= 1 then max_range = 1
    end
    if max_range > 0      
      s = "rescued_from:: #{params[:controller]}##{params[:action]}: #{exception.inspect}\n#{exception.backtrace[0..max_range].to_s}\n"
      logger.error s
    end
    redirect_to determine_redirect_to_path(params[:controller],params[:action])
  end      
end  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...