13

我想知道您如何访问resue块中的ActiveJob执行参数,例如

def perform object
end

rescue_from Exception do |e|
   if e.class != ActiveRecord::RecordNotFound
      **job.arguments.first** 
      # do something
   end
end

谢谢你 !!

4

3 回答 3

18

在块arguments内部是可能的:rescue_from

rescue_from(StandardError) do |exception|
  user = arguments[0]
  post = arguments[1]
  # ...      
end

def perform(user, post)
  # ...
end

这也适用于回调(例如 inside after_perform)。

于 2015-08-19T08:44:29.560 回答
2

我也不知道,然后只是决定尝试selfrescue_from块内使用,它起作用了。

rescue_from(StandardError) do |ex|
  puts ex.inspect
  puts self.job_id
  # etc.
end

作为旁注 - 永远不要救援Exception

为什么在 Ruby 中 `rescue Exception => e` 是一种不好的风格?

于 2015-04-04T13:53:37.317 回答
1

您可以通过访问所有绑定ex.bindings。为确保您获得正确的作业绑定,您应该像这样检查接收器1

method_binding = ex.bindings.find { |b| b.receiver.is_a?(self.class) }

然后您可以使用.local_variable_get. 由于方法参数也是局部变量,您至少可以显式获取它们:

user = method_binding.local_variable_get(:user)
post = method_binding.local_variable_get(:post)

因此,以您为例:

def perform object
end

rescue_from Exception do |e|
   if e.class != ActiveRecord::RecordNotFound
      method_binding = ex.bindings.find { |b| b.receiver.is_a?(self.class) }
      object = method_binding.local_variable_get(:object)
      # do something
   end
end

perform1.如果您在作业的 perform 方法中调用其他实例方法并且错误发生在那里,则此绑定仍然可能不是其中的一个。这也可以考虑,但为简洁起见。

于 2016-10-24T12:35:47.203 回答