Rails Resuce, делая информацию доступной в Switch Rescue - PullRequest
0 голосов
/ 13 декабря 2010

У меня есть следующее:

class MailingJob < Struct.new(:mailing_id)

  class MissingInfo < ArgumentError; end

  def perform
   ....

    begin
      ......
          raise MissingInfo, "Not found", message_all, @message_from if @message_reply.length == 0
      ......    
    rescue MissingInfo => reason, message_all, message_from
      UserMailer.delay.incoming_mails_error_notification(reason, message_all, message_from)
    end

  end

Проблема, с которой я столкнулся здесь, заключается в том, что в моем резюме мне нужен доступ к нескольким переменным в блоке начала, поэтому я пытаюсь пройтиих, когда я звоню поднять.Это не похоже на работу.Кроме того, эти переменные согласованы во многих повышениях, поэтому они действительно заполняют страницу.

Есть ли способ сделать эти переменные доступными в результате без определения их в повышении?

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

SyntaxError (/Users/xxxxx/Sites/xxxxxxx/lib/mailing_job.rb:117: syntax error, unexpected ',', expecting kTHEN or ':' or '\n' or ';'
    rescue MissingInfo => reason, message_all, message_from
                                 ^

Спасибо!

1 Ответ

1 голос
/ 13 декабря 2010

Ключевое слово rescue просто фиксирует объект ошибки.Вам необходимо захватить эти значения внутри объекта исключения:

class MissingInfo < ArgumentError
   attr_accessor :messages
   def initialize(messages = {})
     self.messages = messages
   end
end

begin
  raise MissingInfo.new(:all => message_all, :from => message_from, :reason => reason)
rescue MissingInfo => missing_info
  puts missing_info.messages[:all]
end

НО Это злоупотребление обработкой ошибок.Обычно лучше использовать начало и повышение для реальных ошибок, ошибок, которые вы не ожидаете.MissingInfo звучит как обработка пользовательского ввода.Вы можете ожидать, что пользовательский ввод будет иметь пропущенные данные.Сделайте нормальные проверки для этого.Попробуйте подумать о поведении, которое вы действительно пытаетесь передать.

...