2016-04-20 34 views
0

У меня проблема с улавливанием исключений и ошибок при вызове Proc object. Смотрите мой код:Ruby - Proc.call - исключение для ловли

def method1 
    .. do something ... 
end 

def method2 
.. do something ... 
end 

def run_method_safely(proc_obj) 
    begin 
    proc_obj.call 
    rescue => e 
    puts "Error man!" 
    ... do something ... 
    end 
end 

У меня есть несколько методов (здесь я только method1, method2, но в коде у меня есть гораздо больше методов), которые выполняются методом run_method_safely. Я делаю это так, потому что я не хочу, чтобы каждый метод был в блоке start-rescue, поэтому я написал метод, который позаботится об этом. См:

. 
run_method_safely(Proc.new { method1 }) 
run_method_safely(Proc.new { method2 }) 
. 

Проблема заключается в том, когда proc_obj.call выполняется с ошибкой (метод отсутствует, WebDriver - такой элемент не найден, или любой другой) спасательное блок не выполняется, программа работает как ничего не произошло.

Кто-нибудь знает, как поймать ошибки и исключения из кода Proc?

+2

Можете ли вы создать управляемый образец, который воспроизводит это? –

ответ

0

Вы уверены, что ваш образец верной?

def safe(proc) 
    begin 
    proc.call 
    rescue 
    puts "error" 
    end 
end 

def m1 
    puts "m1" 
    raise 
end 

def m2 
    puts "m2" 
end 

safe(Proc.new { m1 }) 
safe(Proc.new { m2 }) 

Печать

m1 
error 
m2 

для меня.

Btw: вам не нужно обертывать вызов в Proc, вы можете передать объект Method напрямую.

safe(method(:m1)) 
+0

Или - еще больше - передать блок, т. Е. 'Safe {m1}' – Stefan

0

Я думаю, что это должно быть

rescue Exception => e 

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

Примечание стороны: я не знал, что синтаксис

rescue => e 

является действительным. => является двоичным оператором, и для этого вы не предоставляете левый аргумент.

+0

'=>' не является оператором вообще. Вы имеете в виду '<=' or '> ='? – cremno

+0

Не считается ли это * оператором *? В любом случае, он используется внутри хэша, чтобы отделить ключ от значений. '{'key' => 'value', ....}'. Я бы не назвал его оператором; это больше похоже на знак препинания, но тот, который требует чего-то с обеих сторон ... – user1934428

+1

Я считаю, что правильным термином является * пунктуатор *. В любом случае, как вы теперь знаете, это имеет два разных значения. – cremno

0

user1934428 имеет право, проблема была в неправильной ловушке ошибок Webdriver.

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

  • Нет связанных вопросов^_^