使用 Ruby 全局变量来处理异常 $! 在铁轨上

And*_*rea 5 ruby ruby-on-rails global-variables

我正在尝试使用 ruby​​ 全局变量 $! 访问我的 Rails 应用程序中的最后一条异常消息,但尽管在调用该变量之前发生了多个异常,但它还是以 nil 的形式返回。这在 Rails 中不起作用吗?是否有另一种方法可以访问应用程序中引发的最后一个异常?

kwe*_*rle 5

原来是$! 并不是那么全球化。它只在异常的调用堆栈中起作用 - 我认为这是有道理的。

https://www.honeybadger.io/blog/working-with-ruby-exceptions-outside-of-the-rescue-block/

“这意味着 $! 在像 IRB 这样的 shell 中毫无用处。通常在 IRB 中,我会运行一个方法并得到一个异常。有时我想获取该异常对象。但是 $! 不会为此而努力。”


six*_*bit 0

我不知道为什么$!总是返回nil。正如我在上面的评论中所写的,0 / 0 rescue $!可行,但我似乎无法让它在任何其他上下文中工作。

在 Ruby 程序中访问异常的一种方法是使用=>after rescue,如下所示:

[24] pry(main)> begin
[24] pry(main)*   undefined_variable
[24] pry(main)* rescue => e
[24] pry(main)*   puts e
[24] pry(main)* end
undefined local variable or method `undefined_variable' for main:Object
=> nil
Run Code Online (Sandbox Code Playgroud)