从救援块引发另一个错误会发出原始错误,该错误将我们带入救援块

时间:2019-02-01 05:29:55

标签: ruby-on-rails ruby ruby-on-rails-4 exception-handling runtime-error

案件

我有一个带有index方法的Rail 4应用程序控制器,如下所示:

def index
  raise "Original Error"
rescue => e
  puts "We caught: '#{e.inspect}'"
  raise "Another Error"
end

我正在抓捕Original Error,对其进行处理,按摩,做我想做的一切,然后抛出一个完全不同的错误-Another Error


期望

因此,当我访问控制器的索引页面而不是Another Error时,我的Rails应用程序将产生Original Error


意外行为

但是我实际上正在获取Original Error。在此处复制controller#action的日志:

Started GET "/homepage" for 127.0.0.1 at 2019-02-06 18:50:19 +0800
We caught: '#<RuntimeError: Original Error>'
Completed 500 Internal Server Error in 205ms (Flexirest: 0.0ms for 0 calls | ActiveRecord: 9.7ms)

RuntimeError - Original Error:
  app/controllers/homepage_controller.rb:6:in `index'

为什么将Original Error而不是Another Error扔在这里?


但是,控制台中的行为仍然符合预期

我将相同的index方法行复制粘贴到我的Rails控制台中,然后直接从控制台内部调用index方法。这是控制台的输出。

[49] pry(main)> def index
[49] pry(main)*   raise "Original Error"
[49] pry(main)* rescue => e
[49] pry(main)*   puts "We caught: '#{e.inspect}'"
[49] pry(main)*   raise "Another Error"
[49] pry(main)* end
=> :index

[50] pry(main)> index
We caught: '#<RuntimeError: Original Error>'
RuntimeError: Another Error
from (pry):67:in `rescue in index'
[51] pry(main)>

¯\ _(ツ)_ /¯

0 个答案:

没有答案