如何在Rails中引发异常,使其表现得与其他Rails异常一样?


91

我想提出一个异常,以使其执行与普通Rails异常相同的操作。特别是,在开发模式下显示异常和堆栈跟踪,并在生产模式下显示“很抱歉,但是出了点问题”页面。

我尝试了以下方法:

raise "safety_care group missing!" if group.nil?

但这只是写入"ERROR signing up, group missing!"到development.log文件


2
您发布的错误消息似乎并非来自此异常(这是另一则消息),这真的是您所看到的吗?
levinalex

Answers:


139

您不必做任何特殊的事情,它应该可以正常工作。

当我有一个带有此控制器的新的Rails应用程序时:

class FooController < ApplicationController
  def index
    raise "error"
  end
end

http://127.0.0.1:3000/foo/

我看到了堆栈跟踪的异常。

您可能不会在控制台日志中看到整个stacktrace,因为Rails(从2.3开始)从框架本身的堆栈跟踪中过滤掉了行。

config/initializers/backtrace_silencers.rb在您的Rails项目中查看


2
出色,简洁的答案。
RCD 2014年

1
临时链接(看到带有堆栈跟踪的异常)不再起作用
Asaf

@levinalex在生产模式下可以安全地显示stacktrace吗?
BKSpurgeon '16

@levinalex-谢谢alex。有什么方法可以向错误消息添加自定义字符串?
BKSpurgeon '16

62

您可以这样做:

class UsersController < ApplicationController
  ## Exception Handling
  class NotActivated < StandardError
  end

  rescue_from NotActivated, :with => :not_activated

  def not_activated(exception)
    flash[:notice] = "This user is not activated."
    Event.new_event "Exception: #{exception.message}", current_user, request.remote_ip
    redirect_to "/"
  end

  def show
      // Do something that fails..
      raise NotActivated unless @user.is_activated?
  end
end

您在这里所做的是创建一个将作为Exception的类“ NotActivated”。使用raise,可以将“ NotActivated”作为异常抛出。rescue_from是使用指定方法(在这种情况下未激活)捕获异常的方法。一个很长的例子,但是它应该向您展示它是如何工作的。

最好的祝福,
费边


这不会在开发模式下显示异常和堆栈跟踪,而在生产模式下不会显示“很抱歉,但出现了问题”页面。
Chirag Patel

2
“很抱歉”页面实际上是您的Web服务器的500错误处理程序。检查您的.htaccess文件,您通常会在这里看到它
Jeff Paquette 09/12/17

也许不是对OP的答案,而是一个非常有用的示例,谢谢!
尼尔·斯托克布里奇

11

如果您需要一种更简单的方法来进行操作,并且不想大惊小怪,则可以执行以下简单操作:

raise Exception.new('something bad happened!')

这将引发异常,说ee.message = something bad happened!

然后您可以在挽救所有其他异常时将其营救。


引发或挽救“ Exception”本身不是一个好主意,而是尝试使用StandardError。有关详细信息,请参阅本:stackoverflow.com/questions/10048173/...
Ekamjit辛格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.