2016-04-20 12 views
0

Ich habe Probleme beim Abfangen von Ausnahmen und Fehlern beim Aufruf Proc object. Sehen Sie meinen Code:Ruby - Proc.call - Abfangen von Ausnahmen

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 

Ich habe einige Methoden (hier habe ich nur method1, method2 aber in Code ich habe viel mehr Methoden), die durch Verfahren run_method_safely ausgeführt werden. Ich mache das so, weil ich nicht jede Methode im Start-Rescue-Block haben will, also habe ich eine Methode geschrieben, die sich darum kümmert. Siehe:

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

Das Problem ist, wenn proc_obj.call mit Fehlern ausgeführt wird (Methode fehlt, WebDriver - kein solches Element gefunden oder was auch immer) Rettungs Block nicht ausgeführt wird, Programm wie nichts läuft passiert.

Kann jemand Fehler und Ausnahmen von Proc-Code abfangen?

+2

Können Sie eine ausführbare Probe erstellen, die das reproduziert? –

Antwort

0

Sind Sie sicher, dass Ihre Stichprobe korrekt ist?

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 }) 

Drucke

m1 
error 
m2 

für mich.

Btw: Sie müssen den Anruf in einem Proc nicht umbrechen, Sie können das Objekt Method direkt übergeben.

safe(method(:m1)) 
+0

Oder - noch direkter - einen Block übergeben, d. H. 'Safe {m1}' – Stefan

0

ich denke, es

rescue Exception => e 

Der Standard für die Rettung sein sollte, ist nicht alle Fehler abzufangen, sondern nur diejenigen, die sich von StandardError ableiten.

Randbemerkung: Ich war nicht bewusst, dass die Syntax

rescue => e 

gültig ist. => ist ein binärer Operator, für den Sie kein linkes Argument angeben.

+0

'=>' ist überhaupt kein Operator. Meinst du '<=' or '> = '? – cremno

+0

zählt es nicht als * operator *? In jedem Fall wird es in einem Hash verwendet, um Schlüssel von Werten zu trennen. '{'key' => 'Wert', ....}'. Ich hätte es nicht Betreiber nennen dürfen; es ist mehr wie ein Satzzeichen, aber eines, das etwas auf beiden Seiten erfordert ... – user1934428

+1

Ich glaube, der korrekte Ausdruck ist * Punctuator *. Wie Sie jetzt wissen, hat es zwei verschiedene Bedeutungen. – cremno

0

user1934428 hat Recht, Problem war in der falschen Erfassung eines Webdriver-Fehler.

Verwandte Themen