2012-12-01 2 views
1

여기 여기에 조각다시 시도 할 때 보장 절이 호출되지 않는 이유는 무엇입니까?

def take_resource 
    puts "resource taken" 
end 

def free_resource source 
    puts "resource freed from #{source}" 
end 

def do_stuff 
    tries = 0 
    begin 
    take_resource 
    raise 'oops' 
    rescue 
    if tries < 3 
     tries += 1 
     free_resource 'rescue' 
     retry 
    end 
    raise 
    ensure 
    free_resource 'ensure' 
    end 
end 


do_stuff 

# ~> -:13:in `do_stuff': oops (RuntimeError) 
# ~> from -:28:in `<main>' 
# >> resource taken 
# >> resource freed from rescue 
# >> resource taken 
# >> resource freed from rescue 
# >> resource taken 
# >> resource freed from rescue 
# >> resource taken 
# >> resource freed from ensure 

의 우리는 우리가 블록을 retryensure 절이 호출되지 않는 것을 알 수있다. 왜 그런가요? 이것에 대한 논리적 인 설명이 있습니까? 그 이유는 ensureensure이라고 생각했기 때문입니다. 항상 실행됩니다. 글쎄, 내가 틀렸다는 것이 밝혀졌다.

우리가 작업하는 동안 :이 영역에서 다른 문제 (예외 처리)에 대해 알고 있습니까?

+1

흠에 자세히 설명되어 있습니다? 당신의 코드에서 최후의 수단으로'ensure'가 실행됩니다. 그것에 대해 아주 깊이 생각하지 않고, 그것은 나를위한 예상 된 행동입니다. – steenslag

+0

@steenslag : 결국 그렇습니다. 하지만 각 재시도에서 실행되도록 기대하고있었습니다. 그것은 논리적 인 기대가 아닌가? –

+0

내 생각에 블록을 _exiting_ 할 때'보장 '이 실행되어야합니다. '재시도 (retry) '컨트롤을 블록에 남겨두면 @steenslag와 동의 할 것입니다. – matt

답변

1

ensure 예외 또는 정상적으로 블록을 종료 할 때 호출됩니다. retry은 블록의 시작 부분에 실행 지점을 전송하기 만하므로 블록에 그대로 있으며 ensure이 호출되지 않습니다.

블록을 종료 할 때 리소스를 정리하는 데 도움이되는 ensure이 있다고 생각하십시오. 여전히 블록에 있다면 아마도 자원을 사용하고있는 것 같습니다.

이것은 예상되는 동작입니다.

이러한 키워드는 프로그래밍 루비 책 (http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html)

+0

이 문제를 다루는 문서에 대한 링크를 게시 할 수도 있습니까? –

+0

@SergioTulentsev Ruby 프로그래밍에 대한 참조를 추가했습니다. 'retry'와'ensure' 사이의 상호 작용을 명시 적으로 기술하지는 않지만'*'절은 블록 *이 종료 될 때 실행됩니다. 분명히,'재 시도'의 경우 블록은 종료되지 않고 계속 실행됩니다. –

+0

@AlexKorban : 나에게 이것을 철자 해줘서 고마워. –

관련 문제