ActiveJob: Полная трассировка, несмотря на блок relay_from.

У меня есть ванильное приложение Rails, состоящее только из простой модели Post с заголовком и атрибутом содержимого.

Я взял пример исключения ActiveJob из официального руководства по Rails, которое выглядит следующим образом:

class ExceptionTestJob < ApplicationJob
  queue_as :default

  rescue_from(ActiveRecord::RecordNotFound) do |exception|
    logger.error("Could not find given post")
  end

  def perform(post_id)
    post = Post.find(post_id)
  end
end

Если я попытаюсь запустить задание с несуществующим идентификатором сообщения, я получу полную трассировку стека и сообщение об ошибке «Не удалось найти данное сообщение».

Я не хочу получать трассировку стека. Я просто хочу выполнить код, который находится в блоке rescue_from. Как подавить трассировку стека?

Изменить:

Если я использую обычный rescue внутри метода следующим образом:

class ExceptionTestJob < ApplicationJob
  def perform(post_id)
    begin
      Post.find(post_id)
    rescue ActiveRecord::RecordNotFound
      logger.error("Could not find given post")
    end
  end
end

исключение будет перехвачено без обратной трассировки (как и предполагалось), но задание завершится как успешное: Performed ExceptionTestJob (Job ID: c21ce397-b19b-4464-9e53-696707b87dde) from Async(default) in 13.84ms.


person Fabian Winkler    schedule 16.10.2017    source источник
comment
Насколько я понимаю, ваш код блока relay_from работает. что вы хотите дальше, не могли бы вы подробнее объяснить это?   -  person Kaushlendra Tomar    schedule 16.10.2017
comment
Я не хочу, чтобы мои журналы были загрязнены всей трассировкой стека. Мне просто нужно короткое сообщение об ошибке из блока escape_from.   -  person Fabian Winkler    schedule 16.10.2017
comment
Фабиан, кроме лога, какой ответ ты хочешь?   -  person Ursus    schedule 16.10.2017
comment
В итоге только лог.   -  person Fabian Winkler    schedule 16.10.2017
comment
Жаль, что этот вопрос не решен. Это все еще проблема с ActiveJob   -  person nick    schedule 17.07.2020
comment
Моя текущая работа для этого состоит в том, чтобы вызвать исключение, которое возвращает пустую обратную трассировку.   -  person Matthew Panetta    schedule 21.04.2021


Ответы (1)


Я думаю, это поможет вам

begin
  raise
rescue => e
  logger.error e.message
  logger.error e.backtrace.join("\n")
end
person Kaushlendra Tomar    schedule 16.10.2017