[루비 사용자 가이드] 예외 처리: ensure

루비/레일스 프로그래밍/루비 사용자 가이드 2009.02.06 10:42

메소드가 작업을 끝내고 나서 정리 작업을 실행해야 할 경우가 있습니다. 열려있는 파일을 닫거나, 버퍼에 남아있는 데이터를 플러시하는 일과 같은 것들입니다. 만약 모든 메소드마다 메소드에서 나가는 곳이 한군데 씩이라면, 이런 정리 코드를 그 부분에 넣고, 정리코드가 실행될 것을 확신할 수 있을 겁니다. 하지만, 메소드에서 반환될 수 있는 장소는 여러 곳일 수 있습니다. 게다가, 예외가 발생하게 되면 우리가 의도했던 정리 작업이 실행되지 못하고 메소드가 종료될 수도 있습니다.

begin
  file = open("/tmp/some_file", "w")
  # ... write to the file ...
  file.close
end

위의 예에서 파일을 쓰는 부분에서 예외가 발생한다면, 파일이 열린채로 메소드가 종료될 것입니다. 또한, 우리는 다음과 같이 코드를 중복해서 정리작업을 처리하고 싶지도 않습니다.

begin
  file = open("/tmp/some_file", "w")
  # ... write to the file ...
  file.close
rescue
  file.close
  fail # raise an exception
end

위와 같이 하는 것은 보기 좋지 않을 뿐 아니라, 코드가 복잡해질 경우 제대로 다룰 수 없습니다. 왜냐하면, 모든 returnbreak에 대해 정리 작업 코드를 넣어야 하기 때문입니다.

이런 이유로, 예외 처리를 위한 "begin...rescue...end" 방식에 또 하나의 키워드를 추가했습니다. 그것은 ensure입니다. ensure 코드는 begin 블럭이 정상적으로 처리가 완료되건 되지 않았건 간에 수행됩니다.

begin
  file = open("/tmp/some_file", "w")
  # ... write to the file ...
rescue
  # ... handle the exceptions ...
ensure
  file.close   # ... and this always happens.
end

ensurerescue없이 사용할 수도 있고, 거꾸로도 가능합니다. 하지만, 한 begin...end 블럭에서 두 가지 모두 사용하는 경우에는 rescue가 먼저 오고 ensure가 나와야 합니다.

신고
Trackback 0 : Comment 0

티스토리 툴바