2013-09-04 4 views
0

я следующий код:Переменные не распознаются в спасании в Руби

rescue Timeout::Error, StandardError => e 
     puts "Caught exception: #{e.message}".red 
     log.puts("#{e.backtrace}") 
     email_ids_all.each do |email_delete| 
     call= "/api/v2/emails/#{email_delete}/" 
     ...... 

До этого rescue части я определил log и email_ids_all. Однако ни один из них не распознается в рубиновом скрипте. Если я это сделать:

rescue Timeout::Error, StandardError => e 
    File.open(rescuelogfile, 'w') do |log| #setup log to write response codes. 
     puts "Caught exception: #{e.message}".red 
     log.puts("#{e.backtrace}") 
     email_ids_all.each do |email_delete| 
     call= "/api/v2/emails/#{email_delete}/" 
     .... 

log работает отлично, что имеет смысл. Было бы много писать, чтобы переопределить массив email_ids_all и другие переменные, содержащиеся внутри моего блока спасения.

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

begin 

#some code 

rescue 
    #above code 

end 

Я использую ruby ​​1.9.3.

EDIT ----

log начинается сразу после моего заявления begin:

begin 
    File.open(logfile, 'w') do |log| #setup log to write response codes. 

log.puts работает на протяжении всего кода, за исключением, когда выдается ошибка, а затем запускает скрипт спасательную где log недоступно.

То же самое касается email_ids_all. Существует вызов API, который генерирует около 10 000 писем, и каждый из них добавляется в массив email_ids_all. Скрипт получает ошибку примерно на полпути к генерации этих писем, поэтому мне нужен сценарий спасения для удаления всех идентификаторов электронной почты в массиве email_ids_all. Но по какой-то причине я получаю следующую ошибку:

FS_Test_Env.rb:762:in `block in <main>': undefined local variable or method `email_ids_all' for main:Object (NameError) 
    from FS_Test_Env.rb:759:in `open' 
    from FS_Test_Env.rb:759:in `rescue in <main>' 
    from FS_Test_Env.rb:7:in `<main>' 

Любые мысли?

+1

Пожалуйста, напишите полный пример, невозможно угадать, что случилось, не видя кода. – Stefan

+0

@Stefan Я не знаю, как опубликовать более полный пример. Я могу опубликовать весь код, но это около 800 строк, и я не думаю, что кто-то хочет пройти все это. У меня есть массив, определенный внутри цикла begin, и ошибка, которая происходит. Когда он спасет, массив недоступен. Мне просто нужно знать, нормально ли это, а если нет, что может вызвать это. Видя, как я определяю массив и делаю вызовы API, похоже, не имеет значения – Luigi

ответ

0

Объем параметра блока log ограничен этим блоком. В этом весь смысл open с блоком.

Может быть, вы хотите сделать:

begin 
    log = File.open('logfile', 'w') 
    ... 
rescue 
    ... 
ensure 
    log.close 
end 

Обратите внимание, что это не распространяется на ошибки при открытии файла журнала.

Что касается email_ids_all, я предполагаю, что у вас есть исключение в заявлении, как (!):

email_ids_all = ... a long and complex calculation which raises an exception 

Если да, то проблема заключается в том, что назначение происходит только после того, как вся правая часть вычисляется. Var email_ids_all еще не создан, когда происходит исключение.

Для доступа к элементам, созданным до исключения, вы должны отслеживать их, например.

begin 
    email_ids = [] 
    10000.times do 
    email_ids << ... # create element eventually raising an exception 
    end 
rescue 
    ... # treat the already created elements 
end 
+0

Это может работать для 'log', но как насчет массива' email_ids_all'? Должен ли я также определить его за пределами 'begin'? Для меня это не вариант, так как он определен по всему коду. – Luigi

+0

Нет, вы можете также определить его «внутри начала». Он не должен быть локальным для внутреннего блока. Поскольку вы не показывали, откуда это происходит, трудно сказать, что будет правильным решением. –

+0

О, Иисус ... так много узнать. – Luigi

1

, как вы выразились, он должен работать, например:

irb(main):001:0> begin 
irb(main):002:1* x = 1 
irb(main):003:1> x/0 
irb(main):004:1> rescue Exception => e 
irb(main):005:1> p x 
irb(main):006:1> end 
1 
=> 1 

Так это выглядит как исключение, прежде чем ваши переменные определены.

+0

хм странно. См. Мои правки выше. Переменные определенно определены, я пробовал 'puts email_ids_all' до того, как произошла ошибка, и он печатает весь массив без проблем. – Luigi