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_block은 yield 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이 나오겠죠.