Получить вызывающего абонента для исключения Ruby - PullRequest
1 голос
/ 18 октября 2011

В настоящее время наше приложение работает на Heroku, и для сохранения перезапусков и возможной задержки приложение предназначено для кэширования всех ошибок и отправки их в stderr и просто на сервер устаревшего кэша до тех пор, пока проблема не будет решена другим нажатием.Это предотвращает удаление приложения ...

Тем не менее, журналы чрезмерно заполняются целыми трассами, которые нам не нужны, поэтому я создал небольшой фрагмент (частично украденный из Rails) для анализа вызывающей стороны и толькоотправить эту строку, однако с ошибками, отправленными из службы спасения, мы получили неправильную строку, поэтому мне было интересно, как я могу получить вызывающего или вызывающего абонента или есть ли лучший способ справиться с этой ситуацией.Вот фрагмент:

module StdErr
  def error(message)
    file = 'Unknown'
    line = '0'

    if /^(.+?):(\d+)(?::in `(.*)')?/ =~ caller[1]
      file = $1
      line = $2
    end

    $stderr.puts "ERROR: #{message} on line #{line} of #{file}"
  end
end

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Если я получу его, вы захотите вызвать исключение с помощью обратного следа, который начинается с вызывающего абонента. Сделай это:

def raise_cc(*args)
  raise(*args)
rescue Exception
  # Raises the same exception, removing the last 2 items
  # from backtrace (this method and its caller). The first
  # will be the caller of the caller of this method.
  raise($!.class, $!.message, $!.backtrace[2..(-1)])
end
4 голосов
/ 18 октября 2011

caller возвращает массив, и вы можете углубиться в стек вызовов, посмотрев на его более поздние элементы (обратите внимание, что вы смотрите на caller[1])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...