2014-02-08 7 views
1

종종 시간 초과되는 API를 사용하여 스크립트를 실행하고 있습니다. 이 경우 redo에 도달하기 위해 begin/rescue 블록을 사용하고 있지만 redo 명령을 실행하기 전에 명령 줄에 무슨 일이 일어나고 있는지 기록하고 싶습니다.ruby ​​rescue block - 하나의 명령 이상으로 응답하십시오.

begin 
#...api query... 
rescue ErrorClass 
    puts("retrying #{id}") && redo 
end 

불행히도 위의 스크립트는 작동하지 않습니다. 첫 번째 명령 만 실행됩니다.

begin 
# api query 
rescue ErrorClass do ###or:# rescue ErrorClass do |e| 
    puts "retrying #{id}" 
    redo 
end 

을하지만, 그 중 하나가 작동하지 않습니다

나는과 같이 여러 줄의 코드를 실행하는 구조 블록을 강제하고 싶습니다.

내가 행운과 같이 실행하기 위해 별도의 방법을 만드는 했어 ...

def example 
    id = 34314 
    begin 
    5/0 
    rescue ZeroDivisionError 
    eval(handle_zerodiv_error(id)) 
    end 
end 

def handle_zerodiv_error(id) 
    puts "retrying #{id}" 
    "redo" 
end 

를이 실제로 작동합니다. 그러나 그것은 내 의견으로는 너무 많은 코드 라인을 필요로하며 내 멘토 (들)에 따라 어떤 방법으로나 정결하지 않은 평가를 사용합니다.

+0

코드에서 redo' '의 목적은 무엇인가, 나는 당신이 내가 이상 과정을 시작할 수있어 대부분의 시간을 –

+0

찾고있는 것을 얻고 있지 않다 그 id에 오류가 발생했다는 것을 다시 한 번 확인하고 작동합니다. 따라서 스크립트를 중단하지 않고이 작업을 수행하려고합니다. 필연적으로 API 명령 자체가 오류를 일으키는 경우가 있으므로 필자는 스크립트가 동일한 ID에서 멈추는지를 알고 싶습니다. –

+0

* 여러 줄의 코드를 실행하도록 구조 블록을 강제하고 싶습니다. * - 무엇이 문제입니까? 마지막 행이 실행되지 않는다는 것을 의미합니까? –

답변

2

에서입니다. 내장 retry 있습니다. putsnil을 반환하므로 && 버전이 작동하지 않으므로 &&의 바로 가기 평가에 따라 따르는 부분은 평가되지 않습니다.

begin 
    ... 
rescue ErrorClass 
    puts("retrying #{id}") || redo 
end 

begin 
    ... 
rescue ErrorClass 
    puts("retrying #{id}"); redo 
end 

을하지만, 이것조차도 필요하지 않습니다 : 대신 || 또는 ;를 사용하는 경우, 그것은 작동합니다. 당신은 어떻게 든 여러 줄을 쓰려면 rescue 안에 블럭이 필요하다고 생각하는 것 같습니다.하지만 한 줄로 된 블럭을 사용하지 않기 때문에 이해가되지 않습니다. 여러 라인을 가지고있을 때만 블록을 필요로하는 루비 구조는 없습니다. 그래서, 그냥 여러 줄에 넣어 :

begin 
    ... 
rescue ErrorClass 
    puts("retrying #{id}") 
    redo 
end 
1

이 예는 불필요 && 또는 do를 사용하여 일을 복잡하게하는 "루비 프로그래밍 언어"페이지 162

require "open-uri" 

tries = 0 
begin 
    tries +=1 
    open("http://www.example.com/"){|f| puts f.readlines} 
rescue OpenURI::HTTPError => e 
    puts e.message 
    if (tries < 4) 
    sleep (2**tries) # wait for 2, 4 or 8 seconds 
    retry    # and try again 
    end 
end 
+0

'재시도'는 전체'Enumerable' 그룹 ('array')을 다시 시도하고,'redo'는 주어진'Enumberable' 멤버 ('array [n]') 만 다시 시도합니다. –