Ruby on rails 3 如何在Rails中自动记录异常?

Ruby on rails 3 如何在Rails中自动记录异常?,ruby-on-rails-3,Ruby On Rails 3,如果控制器操作中存在异常,并且使用了rescue,Rails也不会在浏览器中显示异常,这是正常的,也不会将异常写入日志文件 在这种情况下,有没有办法让Rails将异常写入日志文件 例如: def some_action 2/0 rescue #this code is called, but Rails does not write the exception to the log end 您正在拯救异常,因此它不会记录它,因为事实上,自从它被拯救以来,实际上没有发生什么不好的事情 您

如果控制器操作中存在异常,并且使用了rescue,Rails也不会在浏览器中显示异常,这是正常的,也不会将异常写入日志文件

在这种情况下,有没有办法让Rails将异常写入日志文件

例如:

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

您正在拯救异常,因此它不会记录它,因为事实上,自从它被拯救以来,实际上没有发生什么不好的事情

您可以在rescue块中输入以下代码,以便在日志中输入条目:

logger.warn "Exception rescued!"

您可以阅读有关使用的更多信息。

您正在拯救异常,因此它不会记录它,因为事实上,自从它被拯救以来,实际上没有发生什么不好的事情

您可以在rescue块中输入以下代码,以便在日志中输入条目:

logger.warn "Exception rescued!"
您可以阅读有关使用的更多信息。

我最终在ApplicationController中使用了rescue\u,记录异常消息和回溯,然后使用params[:controller]和params[:action]确定重定向到哪个控制器/操作

例如,如果PostsControllerShowException'ed'out,我将从中重定向到PostsControllerindex。到目前为止,它一直在工作,所以从救援中重定向到似乎不是一件坏事。我相信时间会让我知道的!只需要确保我的重定向不会导致一些无限循环

如果有人对这项黑客活动感兴趣,请自行承担风险!:

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  
最后,我在ApplicationController中使用了rescue_from,记录了异常消息和回溯,然后使用params[:controller]和params[:action]确定重定向到哪个控制器/操作

例如,如果PostsControllerShowException'ed'out,我将从中重定向到PostsControllerindex。到目前为止,它一直在工作,所以从救援中重定向到似乎不是一件坏事。我相信时间会让我知道的!只需要确保我的重定向不会导致一些无限循环

如果有人对这项黑客活动感兴趣,请自行承担风险!:

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  

这正是问题所在:-我在一个动作中进行了一次救援,执行时会重定向到控制器索引页。当异常发生时,为了找出异常是什么,我必须删除rescue部分并重新运行代码。如果Rails能够将异常记录到文件中就好了!它没有记录异常,因为Rails不知道它,因为在调用堆栈中它冒泡到Rails之前,您已经解救了它。有什么Ruby魔法可以做到这一点吗?我知道我们可以覆盖raise方法,但rescue是一个关键字:…你可以像我在回答中所说的那样手动在日志中输入一个条目。除非我误解了你的意思,否则每次营救一行代码就可以完全满足你的要求。你是对的,但在很多地方这都是代码。我将尝试从那里用rescue_进行黑客攻击,并以某种方式调用我在rescue块中的代码。让我们看看……这正是问题所在:-我在一个动作中进行了一次救援,执行时会重定向到控制器索引页。当异常发生时,为了找出异常是什么,我必须删除rescue部分并重新运行代码。如果Rails能够将异常记录到文件中就好了!它没有记录异常,因为Rails不知道它,因为在调用堆栈中它冒泡到Rails之前,您已经解救了它。有什么Ruby魔法可以做到这一点吗?我知道我们可以覆盖raise方法,但rescue是一个关键字:…你可以像我在回答中所说的那样手动在日志中输入一个条目。除非我误解了你的意思,否则每次营救一行代码就可以完全满足你的要求。你是对的,但在很多地方这都是代码。我将尝试从那里用rescue_进行黑客攻击,并以某种方式调用我在rescue块中的代码。让我们看看..从所有这样的异常中解救将导致用户的意外行为,因为他们试图进行的任何抛出异常的操作都会自动失败。根据Andrew的评论,我建议进行编辑,将其从异常更改为标准错误。从所有这样的异常中解救将导致意外行为用户的行为,因为他们试图进行的任何抛出异常的操作都将以静默方式失败。根据Andrew的评论,我建议进行编辑,将其从异常更改为StandardError