2016-04-20 6 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 

私は方法run_method_safelyによって運営されているいくつかのメソッド(ここでは、私はちょうどmethod1, method2を持っていますが、コードの中で、私はより多くのメソッドを持っている)を持っています。私はこの方法でやっています。なぜなら、私は救助隊のブロックにすべての方法を持つことを望んでいないので、それを気にする方法を書きました。参照:proc_obj.callがエラーで実行された場合

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

問題がある(メソッドが欠落している、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

私は正しい言葉が*句読点*であると信じています。とにかく今あなたが知っているように、それは2つの異なる意味を持っています。 – cremno

0

user1934428が正しく、問題がWebdriverエラーを誤ってキャッチしていました。