2012-10-23 5 views
2

실행하고 싶은 Ruby 함수 호출이 10 개 있으며 각 호출이 예외를 throw 할 수 있습니다. 각 예외를 동일한 방식으로 처리하고 계속하고 싶습니다. begin ... rescue ... end 블록에 각 줄을 배치하지 않고이 작업을 수행 할 수 있습니까?구조 명령문에서 각 명령 줄 바꾸기

[편집] :이 케이스는 Selenium 웹 드라이버를 사용하여 양식을 채우는 화면 스크레이퍼/자동화 도구입니다. select 요소의 옵션이 존재하는지 확인하는 것을 원하지 않습니다. 가능한 한 좋은 것으로 채 웁니다. 이를 위해 Selenium::WebDriver::Support::Select.select_by을 호출하고 "값 x가있는 옵션을 찾을 수 없습니다"예외가 발생하면 계속 진행해야합니다.

답변

5

이런 뜻입니까?

class Wtf 
    def f1 
    raise "f1" 
    end 
    def f2 
    raise "f2" 
    end 
end 

obj= Wtf.new 

[:f1, :f2].each do |f| 
    begin 
    obj.send f 
    rescue Exception=> e 
    p e 
    end 
end 

편집 : 당신이 할 수있는 예를

0

에 더 많은 코드를 추가 : do_something가 발생하고

begin 
    do_something 
    do_something_else 
    do_do_do 
rescue Exception1 => e 
    # error handling 
rescue Exception2 => e 
    # error handling 

경우 예외 다른 호출이 호출되지 않습니다. 그리고 나는 많은 것을 begin.. rescue 블록을 수행하는 것보다 더 좋다고 생각합니다. 그냥 다른 예외를 처리하십시오.

+0

명령문을 모두 같은 예외를 던져 내가 그들 모두를 실행합니다 : – chiborg

+0

ok,하지만 당신이 필요로하는 것에 달려 있습니다. 각 실패를 다르게 처리하고 싶습니까? 하나의 구조 블록에 그들을 묶어 두지 않는 이유는 무엇입니까? 나는 당신이 " "예외가 발생 했으므로 각 함수 (또는 내부)가 끝난 후"상태 "를 변경 한 다음 구조 블록에서 해당 상태를 쿼리해야합니다. – mcortesi

0
def f1; raise "X"; end 
def f2; raise "Y"; end 
#... 
funcList = [:f1,:f2,...] 
funcList.each{|f| 
    begin 
     send(f) 
    rescue Exception => e 
     #handle 
    end 
} 
2

나는 #send를 사용하여 qwned의 접근법을 좋아하지만, 모든 메소드가 순차적으로 호출되지 않는 상황에는 이상적이지 않습니다.

Continuations를는 이런 종류에 적합하다 :

이 각 오류가 발생하기 쉬운 방법을 실행 할 때 'CC'변수에서 연속 촬영에 의해 작동
require 'continuation' 

class Continuer 

    # Define five methods for testing 
    (1..5).each { |i| define_method("method#{i}") { puts "method#{i} called" } } 

    def do_these_things 
    cc = nil 
    callcc { |c| cc = c; method1; } 
    callcc { |c| cc = c; method2; raise } 
    # Do other things right here, maybe... 
    callcc { |c| cc = c; method3; raise } 
    callcc { |c| cc = c; method4; } 
    callcc { |c| cc = c; method5; } 
    rescue 
    puts 'Caught exception. Continuing.' 
    cc.call 
    end 

end 

Continuer.new.do_these_things 

. 그런 다음 구출 문장은 해당 연속에서 간단히 재개됩니다. 동적 레이블을 가진 goto 문과 같습니다.

def action 
    yield 
    rescue 
     .... 
    ensure 
     .... 
end 

action { call1 } 
action { call2 } 
action { call3 } 
6

나는 또한 내가 원하는 것을하는 this answer을 발견했다. 그래서 불행히도 이것은 유효한 대답이 아닙니다 : (
+1

이것은 더 일반적이며 재사용 가능한 솔루션처럼 보입니다! – nurettin