여기 여기에 조각다시 시도 할 때 보장 절이 호출되지 않는 이유는 무엇입니까?
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
의 우리는 우리가 블록을 retry
때 ensure
절이 호출되지 않는 것을 알 수있다. 왜 그런가요? 이것에 대한 논리적 인 설명이 있습니까? 그 이유는 ensure
이 ensure
이라고 생각했기 때문입니다. 항상 실행됩니다. 글쎄, 내가 틀렸다는 것이 밝혀졌다.
우리가 작업하는 동안 :이 영역에서 다른 문제 (예외 처리)에 대해 알고 있습니까?
흠에 자세히 설명되어 있습니다? 당신의 코드에서 최후의 수단으로'ensure'가 실행됩니다. 그것에 대해 아주 깊이 생각하지 않고, 그것은 나를위한 예상 된 행동입니다. – steenslag
@steenslag : 결국 그렇습니다. 하지만 각 재시도에서 실행되도록 기대하고있었습니다. 그것은 논리적 인 기대가 아닌가? –
내 생각에 블록을 _exiting_ 할 때'보장 '이 실행되어야합니다. '재시도 (retry) '컨트롤을 블록에 남겨두면 @steenslag와 동의 할 것입니다. – matt