LocalJumpError

LocalJumpError

Ruby가 요청한 대로 yield(블록 호출)를 할 수 없을 때 발생하는 예외예요. StandardError가 아니라 ScriptError 계열 예외예요.

출처: Ruby 4.0 API

본문

yield는 메서드 안에서 "블록을 호출하겠다"는 뜻이에요. 그런데 정작 블록을 넘겨주지 않은 채 메서드를 호출하면 호출할 블록이 없으니 LocalJumpError가 나요.

def call_block
  yield 42
end
call_block

이 코드는 예외를 던져요.

LocalJumpError: no block given (yield)

call_blockyield 42를 하려는데 호출한 쪽에서 블록을 안 줬으니 no block given (yield)라는 메시지가 나는 거예요.

조금 더 미묘한 경우도 있어요. Proc 안에서 일어난 return이 문제가 될 때가 있죠.

def get_me_a_return
  Proc.new { return 42 }
end
get_me_a_return.call

블록에선 return이 그 블록을 정의한 메서드(여기선 get_me_a_return)로부터 돌아가려고 해요. 그런데 이 블록은 Proc로 만들어져서 반환됐고, 정작 get_me_a_return이 이미 끝나버린 뒤(반환된 뒤)에 call로 호출되는 상황이에요. 돌아갈 곳이 없으니 다음과 같은 예외가 나요.

LocalJumpError: unexpected return

인스턴스 메서드

exit_value  → obj

LocalJumpError와 연결된 exit 값(블록이 종료될 때 전달하려던 값)을 돌려줘요.

reason   → symbol

블록이 종료된 이유를 심볼로 돌려줘요. 값은 :break, :redo, :retry, :next, :return, :noreason 중 하나예요. 앞선 예시처럼 return 때문에 발생했다면 :return이 나오겠죠.