2013-09-27 3 views
2

Я пишу скрипт, который собирает данные из разных url. Я хочу собрать ошибки из begin rescue блоков в массив, чтобы выводить их, когда программа работает в подробном режиме. При нормальном использовании неудавшееся соединение игнорируется, и сценарий переходит к следующему URL-адресу.Сбор исключений в скрипте ruby ​​

Я думал, что лучший способ сделать это было бы создать массив errArray = Array.new в верхней части сценария держать ошибки, а затем сделать:

rescue Exception => e 
    errArray << e.message 

в различных функциях журнал ошибок. Функция die выводит массив с использованием p, если он не пуст. Однако, я получаю ошибку

Undefined local variable or method 'errArray' 

Любая помощь (и конструктивная критика) оценена.

EDIT: умереть функция:

def die(e) 
    p errorArray unless errorArray.empty? 
# Some other irrelevant code 
end 
+1

Мы должны видеть то полный код 'die' method..to сказать вам почему ошибка 'Undefined local variable или method 'errArray''. Его проблема связана с областью. Создайте глобальную переменную '$ errArray = Array.new'. Как вы сказали *, я думал, что лучший способ сделать это - создать массив errArray = Array.new в верхней части скрипта для хранения ошибок *. –

+0

Что такое 'e'? Дайте всему телу –

ответ

4

errArray не глобальная переменная, и поэтому методы не имеют доступа к нему. Вы можете объявить его глобальной переменной на $err_array.

Однако лучшим решением было бы создать простой класс:

class ExceptionCollector 

    def collect 
    yield 
    rescue => e 
    errors << e.message 
    end 

    def errors 
    @errors ||= [] 
    end 
end 

А потом просто:

$logger = ExceptionCollector.new 

$logger.collect do 
    # this may raise an exception 
end 

def foo 
    $logger.collect do 
    # another exception 
    end 
end 

$logger.errors #=> list of errors 
+0

Спасибо. Очень полезно. Могу ли я использовать переменные из метода, вызывающего $ logger в методе $ collect? – Ipsum

+0

Ничего, подумал. – Ipsum

Смежные вопросы