为什么这个加注没有被挽救,什么会纠正它,使它成为现实?

Why is this raise not rescued, and what will correct it so that it is?

我正在尝试创建自己的 StandardError 异常,但我似乎无法通过加注触发 rescue_from。错误被提出但从未被挽救。我搭建了一个简单的应用来试试,如下:

class ApplicationController < ActionController::Base

  protect_from_forgery with: :exception

  class ApplicationController::LocationInvalid < StandardError
  end

  rescue_from ApplicationController::LocationInvalid, with: :reset_it

  raise ApplicationController::LocationInvalid

  private

  def reset_it(exception)
    session.clear
    cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
    puts 'Reset it processed'
  end
end

当我将加注包装在 begin/rescue/end 中时,它会将 e 打印为 ApplicationController::LocationInvalid:

  begin
    raise ApplicationController::LocationInvalid
  rescue => e
    puts e
  end

输出:

Started GET "/" for 127.0.0.1 at 2015-08-21 15:19:32 -0400 ApplicationController::LocationInvalid

我尝试了各种形式的指定 ApplicationController class,但结果没有任何变化...

根据 Rails https://github.com/rails/rails/blob/f62fb985b6a7b90872148f0786219c9cc94c9356/actionpack/lib/action_controller/metal/rescue.rb#L32

的源代码

rescue_with 仅在 process_action 调用期间有效,但您在 class 评估期间引发异常。可能最简单的测试方法是创建带有一些动作的简单控制器,并尝试在该动作期间引发异常,rescue_with 应该可以工作。